से सबक्लास में वर्चुअल फ़ंक्शन को कॉल करना मुझे पता है कि यह प्रश्न अंतहीन समय से ढंका हुआ होगा, लेकिन मैंने पिछले प्रश्नों की खोज की है, और कुछ भी पॉप नहीं दिखता है।सुपरक्लास
यह विरासत और वर्चुअल फ़ंक्शंस I C++ के बारे में है। मुझे सुपरक्लास से उप-वर्गों में आभासी कार्यों को कॉल करने में समस्या है।
मुझे एक उदाहरण दें। तीन वर्गों के साथ शुरू करें, जो एक-दूसरे से प्राप्त होते हैं।
class A {
void foo() { bar() }
virtual void bar() { }
};
class B : public A {
virtual void bar() { }
};
class C : public B {
virtual void bar() { // do something }
};
अब मैं बी * के रूप में घोषित एक चर होना चाहता हूं लेकिन सी * के रूप में तत्काल होना चाहता हूं।
B* myObject = new C();
myObject->foo();
जब मैं ऐसा करते हैं, और myObject पर foo फोन(), तो एक :: foo()() बार बुला रहा है। लेकिन केवल बी :: बार() को सी :: बार() नहीं कहा जाता है - जो वास्तव में myObject है, भले ही इसे बी के रूप में घोषित किया गया हो, जो फिर से प्रभावित करता है कि "// कुछ भी नहीं" निष्पादित नहीं होता है।
मैं ए :: foo() कैसे कहूं, कि इसे सबसे कम कार्यान्वयन को देखने की आवश्यकता है?
समझ में आता है?
// Trenskow
संपादित करें:
सी :: फू समस्या नहीं है। कक्षा ए में फू को बुलाया जा रहा है, क्योंकि यह एकमात्र जगह है जिसे इसे लागू किया गया है। समस्या उत्पन्न होती है, जब ए: फू बार() को कॉल करता है। फिर बी: बार को कॉल किया जाता है और सी :: बार नहीं।
हो सकता है कि समस्या है, मेरी कार्यान्वयन में, मैं सिर्फ ए
इस तरहमें वस्तु के लिए एक शून्य * सूचक मिलता है कि:
void A:Foo(void *a) {
A* tmpA = static_cast<A*> (a);
tmpA->bar();
}
अब संकलक सोचता है, कि tmpA एक है ए। लेकिन किसी भी तरह यह यह समझने का प्रबंधन करता है कि यह बी * है, और बी :: बार कहता है, वास्तव में जब टीएमपीए सी * होता है और इसे सी :: बार को कॉल करना चाहिए।
यदि आपने वास्तविक कोड पोस्ट किया है तो हम बता सकते हैं कि समस्या है। आपको कुछ खास करने की ज़रूरत नहीं है। अगर वाक्यविन्यास त्रुटियों को ठीक किया गया है, तो कोड ('myObject-> foo();') 'सी :: बार() 'कॉल करेगा। – UncleBens
... लेकिन अगर मुझे अनुमान लगाया गया था, तो 'सी' वास्तव में' बार '(एक अलग हस्ताक्षर होने) को ओवरराइड नहीं करता है, या आप ऑब्जेक्ट को कहीं भी टुकड़ा कर रहे हैं (कुछ * * variable = * myObject; ' – UncleBens
मैं अभी भी इसे नहीं खरीदता। सी :: बार() क्यों नहीं कहा जाएगा? क्या आप वास्तविक कोड पोस्ट कर सकते हैं? – EboMike