將基類指針賦給派生類的問題

將派生類地址賦給基類指針,也就是基類指針指派生類對象,也就是我們平時說的多態

但是反過來的時候,必須經過強制類型轉換纔可以編譯通過,

下來直接代碼:

#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指針的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章