के लिए इस कोड को देखते हैं:कैसे आधार वर्ग सूचक के माध्यम से व्युत्पन्न वर्ग की आभासी समारोह कॉल करने के लिए
class CBase
{
public:
virtual vfunc() { cout << "CBase::vfunc()" << endl; }
};
class CChild: public CBase
{
public:
vfunc() { cout << "CChild::vfunc()" << endl; }
};
int main()
{
CBase *pBase = new CBase;
((CChild*)pBase)->vfunc(); // !!! important
delete pBase;
return 0;
}
उत्पादन होता है:
CBase::vfunc()
लेकिन मैं देखना चाहता हूँ: CChild :: vfunc()
स्पष्ट ((सीसीएचल्ड *) पीबीएएस) "सीसीएचल्ड *" टाइप करने के लिए उत्सुक है। तो व्युत्पन्न vfunc() को कॉल करने के लिए मुझे "महत्वपूर्ण" स्ट्रिंग को प्रतिस्थापित करने की आवश्यकता क्यों है: ((CChild *) pBase) -> CChild :: vfunc();
तो Schildt H को कैसे समझें: "बेस बेस पॉइंटर को उस आधार से प्राप्त किसी भी वर्ग के किसी ऑब्जेक्ट के लिए पॉइंटर के रूप में भी उपयोग किया जा सकता है"। – LEXX
और इसलिए स्ट्रिंग ((CChild *) pBase क्यों) -> CChild :: vfunc() काम करता है? – LEXX
@LEXX: सबसे पहले, आपको उस पुस्तक को जला देना चाहिए और [एक अच्छी प्रारंभिक पुस्तक] प्राप्त करना चाहिए (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)। वह उद्धरण में जो कहता है वह सही है, यद्यपि। बेस क्लास पॉइंटर ('सीबीएएस *') 'सीबीएसई' (जैसे 'सीसीएचल्ड') से व्युत्पन्न प्रकार के किसी ऑब्जेक्ट को इंगित कर सकता है।ऐसा नहीं है कि आपने क्या किया है, यद्यपि: आपका बेस क्लास पॉइंटर बेस क्लास ऑब्जेक्ट को इंगित करता है। यदि आपके पास, उदाहरण के लिए, 'सीबीज़ * पी = नया सीसीएचआईल्ड();', तो 'पी 'एक व्युत्पन्न वर्ग की वस्तु को इंगित करने वाला बेस क्लास पॉइंटर होगा। –