#include using namespace std;class Base{int x;public:Base(int b):x(b){}virtual void display(){cout< }};class Derived:public:Base{int y;public:Derived(int d):Base(d):y(d){}void display(){cout }};int main(){Base b(3);Derived d(4);b.display();d.display();Base *p=&d;p->display();return ();}
1 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
首先,你的程序是错的,讨论一个无法编译的程序的结果毫无意义。
所以,我修改了这个程序,在修改的时候我尽量保持它和你的意图保持一致,但是你原先是什么意图,我并不能100%知道,所以这个前提你必须知道。
下面是修正的程序,我的分析基于这个程序:
#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; }
这个程序的结果是
3
4
4
第一行输出3,这个没什么好分析的,
第二行,你的构造函数传入了4,这个构造函数分别将base里定义的x和Derived定义的y设置成了4
d.display();调用的是派生类的display,输出的是y,也就是4
第三行p->display();调用的是虚函数display,因为派生类覆盖了display,所以还是调用的派生类的display,此时输出的还是派生类的y,所以还是4。
再多说一句,如果去掉virtual void display()的virtual,结果虽然还是 3 4 4,但是这两个4的含义就不同了,前者是派生类的y,后者是基类的x
最后说一句,基类的display永远看不见派生类的y。
- 1 回答
- 0 关注
- 928 浏览
添加回答
举报
0/150
提交
取消