2010-12-10 48 views
6
class Base 
{ 
public: 
Base() 
{ 
cout<<"base class"<<endl; 
fun(); 
} 
virtual void fun(){cout<<"fun of base"<<endl;} 
}; 

class Derive:public Base 
{ 
public: 
Derive() 
{ 
cout<<"derive class"<<endl; 
fun(); 
} 
void fun(){ cout<<"fun of derive"<<endl;} 
}; 

void main() 
{ 
Derive d; 
} 

उत्पादन होता है:क्यों मेरी वर्चुअल विधि ओवरराइड नहीं है?

base class 
fun of base 
derive class 
fun of derive 

क्यों दूसरी पंक्ति fun of derive नहीं है?

+3

पढ़ना सामग्री: ["कभी भी निर्माण या विनाश के दौरान वर्चुअल फ़ंक्शंस को कॉल न करें"] (http://www.artima.com/cppsource/nevercall.html)। –

उत्तर

4

जब आप आधार वर्ग निर्माता में fun() फोन, व्युत्पन्न वर्ग है अभी तक नहीं बनाया गया है (सी ++ में, पहले एक निर्मित माता-पिता को कक्षाएं) इसलिए सिस्टम में अभी तक व्युत्पन्न का उदाहरण नहीं है और इसके परिणामस्वरूप Derived::fun() के लिए वर्चुअल फ़ंक्शन तालिका में कोई प्रविष्टि नहीं है।

यही वजह है कि निर्माताओं में आभासी कार्यों आम तौर पर पर जब तक आप विशेष रूप से आभासी समारोह है कि वस्तु के दोनों भाग वर्तमान में instantiated जा रहा है या अपने पूर्वजों में से एक का हिस्सा है के कार्यान्वयन कॉल करना चाहते हैं सिकोड़ी रहे हैं करने के लिए कहता है।

2

क्योंकि आप ऐसा लिखा था ... व्युत्पन्न वर्ग निर्माता को आपका कॉल करता है:

- Base Class Constructor call 
    | 
    Call to **fun of Base Class** 
- Derived Class Constructor call 
    | 
    Call to **fun of the Derived Class** 

अधिक जानकारी here

+0

आधार वर्ग में वर्चुअल विधि हमेशा एक ही हस्ताक्षर के साथ व्युत्पन्न विधि द्वारा ओवरराइड नहीं है, यहां तक ​​कि कन्स्ट्रक्टर में भी? – yoyo

+0

हां, लेकिन उत्तर अभी टिमो द्वारा दिया गया है :) –

संबंधित मुद्दे