क्यों हमारे पास बेस क्लास में शुद्ध वर्चुअल असाइनमेंट ऑपरेटर है, तो हम उस ऑपरेटर को व्युत्पन्न कक्षा पर लागू करते हैं, यह बेस क्लास पर लिंकर त्रुटि देता है?सी ++: शुद्ध वर्चुअल असाइनमेंट ऑपरेटर
वर्तमान में मैं केवल यह कहा http://support.microsoft.com/kb/130486 पर निम्नलिखित विवरण दिया है कि व्यवहार सामान्य विरासत नियमों के बाद से डिजाइन के द्वारा होता है लागू नहीं होता।
यह मेरे लिए स्पष्ट नहीं है, यह डिज़ाइन द्वारा लिंकर त्रुटि क्यों उत्पन्न करता है? क्या कोई मुझे इस बारे में और स्पष्ट स्पष्टीकरण दे सकता है?
संपादित करें: मेरे सरलीकृत कोड जिनमें से त्रुटि हुई कहा:
class __declspec(dllexport) BaseClass {
public:
int memberA;
virtual BaseClass& operator=(const BaseClass& rhs) = 0;
};
class __declspec(dllexport) DerivedClass : public BaseClass {
public:
int memberB;
DerivedClass():memberB(0) {}
virtual BaseClass& operator=(const BaseClass& rhs) {
this->memberA = rhs.memberA;
this->memberB = 1;
return *this;
}
};
int main(void)
{
DerivedClass d1;
DerivedClass d2;
BaseClass* bd1 = &d1;
BaseClass* bd2 = &d2;
*bd1 = *bd2;
}
कोड के बिना शुद्ध आभासी ऑपरेटर__declspec(dllexport)
और/या बिना कोई त्रुटि साथ संकलन = आधार वर्ग पर घोषणा करेंगे ।
*bd1 = *bd2;
का काम करने के बाद __declspec(dllexport)
बिना , d1 :: memberB 1 है, लेकिन साथ __declspec(dllexport)
d1 :: memberB __declspec(dllexport)
साथ
अपरिवर्तित, और शुद्ध आभासी घोषणा के बिना छोड़ दिया है *bd1 = *bd2;
का काम करने के बाद,, d1 :: memberB अपरिवर्तित
पूर्ण लिंकर त्रुटि के साथ कुछ उदाहरण कोड पोस्ट करने में मददगार हो सकता है एमएसवीसी – Necrolis
एफडब्ल्यूआईडब्ल्यू, स्कॉट मेयर्स के आइटम 33 और अधिक प्रभावी सी ++ _ ("गैर-लीफ क्लासेस सार बनाएं") को सौदा करने के तरीके को कवर करता है ऑपरेटर = विरासत पदानुक्रम में। –
@necrolis: उदाहरण कोड – uray