वर्चुअल असाइनमेंट ऑपरेटर को लागू करने के साथ खेलते समय मैंने एक मजेदार व्यवहार के साथ समाप्त कर दिया है। यह एक कंपाइलर गड़बड़ नहीं है, क्योंकि जी ++ 4.1, 4.3 और वीएस 2005 एक ही व्यवहार साझा करते हैं।वर्चुअल असाइनमेंट समान हस्ताक्षर के अन्य आभासी कार्यों की तुलना में अलग तरीके से क्यों व्यवहार करता है?
असल में, आभासी ऑपरेटर = वास्तव में निष्पादित किए जा रहे कोड के संबंध में किसी अन्य वर्चुअल फ़ंक्शन से भिन्न व्यवहार करता है।
struct Base {
virtual Base& f(Base const &) {
std::cout << "Base::f(Base const &)" << std::endl;
return *this;
}
virtual Base& operator=(Base const &) {
std::cout << "Base::operator=(Base const &)" << std::endl;
return *this;
}
};
struct Derived : public Base {
virtual Base& f(Base const &) {
std::cout << "Derived::f(Base const &)" << std::endl;
return *this;
}
virtual Base& operator=(Base const &) {
std::cout << "Derived::operator=(Base const &)" << std::endl;
return *this;
}
};
int main() {
Derived a, b;
a.f(b); // [0] outputs: Derived::f(Base const &) (expected result)
a = b; // [1] outputs: Base::operator=(Base const &)
Base & ba = a;
Base & bb = b;
ba = bb; // [2] outputs: Derived::operator=(Base const &)
Derived & da = a;
Derived & db = b;
da = db; // [3] outputs: Base::operator=(Base const &)
ba = da; // [4] outputs: Derived::operator=(Base const &)
da = ba; // [5] outputs: Derived::operator=(Base const &)
}
प्रभाव है कि आभासी ऑपरेटर = समान हस्ताक्षर से किसी अन्य आभासी समारोह की तुलना में एक अलग व्यवहार किया है ([0] [1] की तुलना में), जब कहा जाता है के माध्यम से ऑपरेटर की बेस संस्करण को फोन करके असली व्युत्पन्न वस्तुएं ([1]) या व्युत्पन्न संदर्भ ([3]) जबकि यह बेस संदर्भ ([2]) के माध्यम से कॉल किए जाने पर नियमित वर्चुअल फ़ंक्शन के रूप में कार्य करता है, या जब या तो लालसा या रावल्यू मूल संदर्भ हैं और दूसरा व्युत्पन्न संदर्भ ([4], [5])।
क्या इस अजीब व्यवहार के लिए कोई समझदार स्पष्टीकरण है?
कोई यहाँ शामिल अनुमान लगा है। नियम बहुत सख्त हैं। – MSalters
धन्यवाद, वास्तविक उत्तर (जैसा कि पहले से ही तीन लोगों द्वारा पोस्ट किया गया है) यह है कि संकलित जेनरेटर ऑपरेटर = व्युत्पन्न वर्ग के लिए बेस :: ऑपरेटर = को स्पष्ट रूप से कॉल करता है। मैं इसे 'स्वीकृत उत्तर' के रूप में चिह्नित कर रहा हूं क्योंकि यह पहला था। –
'a = static_cast <बेस &>(b); 'सी-स्टाइल कास्ट से बचने का एक तरीका होगा (जो गलती से एक बार फिर से डालने का जोखिम लेता है) –