सी ++ में जब किसी वर्चुअल फ़ंक्शन को कन्स्ट्रक्टर के भीतर से बुलाया जाता है तो यह वर्चुअल फ़ंक्शन की तरह व्यवहार नहीं करता है। मुझे लगता है कि पहली बार जो भी सामना करना पड़ा वह आश्चर्यचकित था लेकिन दूसरे विचार पर यह समझ में आता है, अगर व्युत्पन्न कन्स्ट्रक्टर ने अभी तक ऑब्जेक्ट नहीं चला है अभी तक व्युत्पन्न तो व्युत्पन्न फ़ंक्शन कैसे कहा जा सकता है? पूर्व शर्तों को स्थापित करने का मौका नहीं मिला है। उदाहरण:रचनाकारों में वर्चुअल फ़ंक्शंस, भाषाएं अलग क्यों होती हैं?
class base {
public:
base()
{
std::cout << "foo is " << foo() << std::endl;
}
virtual int foo() { return 42; }
};
class derived : public base {
int* ptr_;
public:
derived(int i) : ptr_(new int(i*i)) { }
// The following cannot be called before derived::derived due to how C++ behaves,
// if it was possible... Kaboom!
virtual int foo() { return *ptr_; }
};
यह बिल्कुल जावा के लिए ही है और .NET फिर भी वे दूसरे रास्ते से जाने के लिए चुना है, एकमात्र कारण कम से कम के सिद्धांत आश्चर्य था?
आपको क्या लगता है कि सही विकल्प है?
यह कंपाइलर के लिए और अधिक काम कैसे करता है? यह बेस क्लास के कन्स्ट्रक्टर को कॉल करने के बाद बस Vptr सेट करने के लिए उबलता है। मैं कहूंगा कि अन्य अर्थशास्त्र लागू करना कठिन है क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि व्युत्पन्न वर्ग कन्स्ट्रक्टर में vptr सेट करने के बाद, इसे बेस क्लास कन्स्ट्रक्टर द्वारा ओवरराइड नहीं किया जाना चाहिए। (यह माना जा रहा है कि गतिशील प्रेषण को पॉइंटर्स के माध्यम से वर्चुअल विधि तालिकाओं में संभाला जाता है, जो सबसे आम दृष्टिकोण है।) –
@LucTouraille बहुत बेल्ट +1, यह बहुत सच है। सी ++ दृष्टिकोण वास्तव में बहुत साफ और अधिक सरल है –