1 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先,你的程序是錯(cuò)的,討論一個(gè)無(wú)法編譯的程序的結(jié)果毫無(wú)意義。
所以,我修改了這個(gè)程序,在修改的時(shí)候我盡量保持它和你的意圖保持一致,但是你原先是什么意圖,我并不能100%知道,所以這個(gè)前提你必須知道。
下面是修正的程序,我的分析基于這個(gè)程序:
#include <iostream> using namespace std; class Base{ int x; public: Base(int b):x(b){} virtual void display() { cout<<x<<endl; } }; class Derived:public Base{ int y; public: Derived(int d):Base(d),y(d){} void display(){ cout<<y<<endl; } }; int main(){ Base b(3); Derived d(4); b.display(); d.display(); Base *p=&d; p->display(); return 0; }
這個(gè)程序的結(jié)果是
3
4
4
第一行輸出3,這個(gè)沒(méi)什么好分析的,
第二行,你的構(gòu)造函數(shù)傳入了4,這個(gè)構(gòu)造函數(shù)分別將base里定義的x和Derived定義的y設(shè)置成了4
d.display();調(diào)用的是派生類的display,輸出的是y,也就是4
第三行p->display();調(diào)用的是虛函數(shù)display,因?yàn)榕缮惛采w了display,所以還是調(diào)用的派生類的display,此時(shí)輸出的還是派生類的y,所以還是4。
再多說(shuō)一句,如果去掉virtual void display()的virtual,結(jié)果雖然還是 3 4 4,但是這兩個(gè)4的含義就不同了,前者是派生類的y,后者是基類的x
最后說(shuō)一句,基類的display永遠(yuǎn)看不見(jiàn)派生類的y。
- 1 回答
- 0 關(guān)注
- 966 瀏覽
添加回答
舉報(bào)