मुझे समझ में नहीं आ रहा है कि निम्न कोड में क्यों, जब मैं daughter
टाइप करता हूं, तो डिफ़ॉल्ट grandmother()
कन्स्ट्रक्टर को कॉल किया जाता है?डिफ़ॉल्ट कन्स्ट्रक्टर वर्चुअल विरासत में क्यों कहा जाता है?
मैंने सोचा कि या तो grandmother(int)
कन्स्ट्रक्टर को कॉल किया जाना चाहिए (मेरे mother
वर्ग कन्स्ट्रक्टर के विनिर्देश का पालन करने के लिए), या वर्चुअल विरासत के कारण यह कोड संकलित नहीं होना चाहिए।
यहां संकलक चुपचाप grandmother
मेरी पीठ में डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है, जबकि मैंने कभी इसके लिए नहीं पूछा।
#include <iostream>
class grandmother {
public:
grandmother() {
std::cout << "grandmother (default)" << std::endl;
}
grandmother(int attr) {
std::cout << "grandmother: " << attr << std::endl;
}
};
class mother: virtual public grandmother {
public:
mother(int attr) : grandmother(attr) {
std::cout << "mother: " << attr << std::endl;
}
};
class daughter: virtual public mother {
public:
daughter(int attr) : mother(attr) {
std::cout << "daughter: " << attr << std::endl;
}
};
int main() {
daughter x(0);
}
क्या कंपाइलर (और संस्करण)? आपने किस तर्क के साथ संकलन किया? – orlp
जीसीसी 4.6.3 20120306 (रेड हैट 4.6.3-2) फेडोरा 15 पर। तर्क हैं: -O0 -g3 -Wall -c -fmessage-length = 0 –
g ++ 4.1.2 में एक ही समस्या है: http: // codepad.org/L0jBXfSP – orlp