將派生類地址賦給基類指針,也就是基類指針指派生類對象,也就是我們平時說的多態
但是反過來的時候,必須經過強制類型轉換纔可以編譯通過,
下來直接代碼:
#include<iostream>
usingnamespacestd;
class Base
{
public:
virtual void print()
{
cout<<"base"<<endl;
}
};
class Derived:public Base
{
public:
void print()
{
cout<<"derived"<<endl;
}
};
int main(void)
{
Base * pb=new Base();//定義基類指針
Derived * pd=(Derived*)pb;//賦值給派生類指針
pd->print();//調用基類的print輸出base
pd->Derived::print();//調用派生類的print輸出derived
return 0;
}
我想問問用pd->print()爲什麼調用的是基類的print
然後爲什麼將基類的virtual去掉之後,調用的便是派生類的print
------------------------------------------解答----------------------------------------------
調用哪個虛函數是由對象所指的虛函數表所決定的,當你 new Base()的時候pb所指向的虛函數表中的虛函數是Base的,用(Derived*)強制轉化並沒改變,而非虛函數主要根據指針類型,也就是說pd一開始就是Derived,所以用Derived的函數,成員函數在調用時其實是調用了this指針的。