讓我們來看看下面的代碼:如何通過基類指針調用派生類的虛函數
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()
顯式((CChild *)pBase)強制類型爲「CChild *」。那麼爲什麼要調用派生的vfunc()我需要替換「重要的」字符串: ((CChild *)pBase) - > CChild :: vfunc();
所以如何理解Schildt H .:「基類指針也可以用作指向從該基類派生的任何類的對象的指針」。 – LEXX 2012-08-10 19:00:51
爲什麼字符串((CChild *)pBase) - > CChild :: vfunc()的工作原理? – LEXX 2012-08-10 19:06:32
@LEXX:首先,您應該刻錄該書並獲得[一本好的入門書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。不過,他在該報價中所說的話是正確的。基類指針('CBase *')可以指向從'CBase'派生的類型的對象(如'CChild')。但這並不是你所做的:你的基類指針指向一個基類對象。例如,如果你有'CBase * p = new CChild();',那麼'p'將是一個指向派生類的對象的基類指針。 – 2012-08-10 19:32:33