से वर्चुअल फ़ंक्शन को कॉल करना मैं Effective C++ पढ़ रहा हूं, और "आइटम 9: कभी भी निर्माण या विनाश के दौरान वर्चुअल फ़ंक्शंस को कॉल न करें"। और मैं सोच रहा हूं कि मेरा कोड ठीक है, भले ही यह इस नियम को तोड़ता है:कन्स्ट्रक्टर
using namespace std;
class A{
public:
A(bool doLog){
if(doLog)
log();
}
virtual void log(){
cout << "logging A\n";
}
};
class B: public A{
public:
B(bool doLog) : A(false){
if(doLog)
log();
}
virtual void log(){
cout << "logging B\n";
}
};
int main() {
A a(true);
B b(true);
}
क्या इस दृष्टिकोण में कुछ गड़बड़ है? जब मैं कुछ और जटिल करता हूं तो क्या मुझे परेशानी हो सकती है?
यह मुझे बताता है कि अधिकांश उत्तरों ने जो किया वह मुझे नहीं मिला, और उन्होंने बस फिर से समझाया कि कन्स्ट्रक्टर से वर्चुअल फ़ंक्शन को खतरनाक क्यों कहा जा रहा है।
मैं तनाव करने के लिए अपने कार्यक्रम के उत्पादन में इस तरह दिखता है कि चाहते हैं:
logging A
logging B
तो मैं एक लॉग इन किया जब यह निर्माण किया है और बी लॉग इन किया जब यह निर्माण किया है मिलता है। और यही वह है जो मैं चाहता हूं! लेकिन मैं पूछ रहा हूं कि क्या आपको कन्स्ट्रक्टर में वर्चुअल फ़ंक्शन को कॉल करने के साथ समस्या को दूर करने के लिए "हैक" के साथ कुछ भी गलत (संभावित खतरनाक) लगता है।
इस मामले में आपने इसे ठीक से दबाया है, लेकिन यदि अन्य लोगों को उस कोड गलतियों का उपयोग करने की आवश्यकता है तो होने वाली हैं। –
@ जोचिमपिलबोर्ग यह सच नहीं है: व्यवहार * परिभाषित किया गया है। निर्माण के दौरान, वर्चुअल फ़ंक्शन कॉल अक्षम हैं (उदाहरण के लिए वर्तमान में निर्माण प्रकार का कार्यान्वयन किया जाता है)। –