标签:
问题及代码:
(1)程序执行后,运行结果是多少?
(2)将程序中有注释的两条语句修改为注释的内容,即将“class B:public A {};”修改为“class B:virtual public A{};”,“class C:public A {}; ”修改为“class C:virtual public A{};”,重新编译运行程序,程序的运行结果又是多少?
#include<iostream> using namespace std; class A { public: int n; }; class B:public A {}; // class B:virtual public A{}; class C:public A {}; // class C:virtual public A{}; class D:public B,public C { public: int getn() { return B::n; } }; int main() { D d; d.B::n=10; d.C::n=20; cout<<d.getn()<<endl; return 0; }
运行结果:
1.修改前
int main() { D d; d.B::n=10; //D的对象成员 B的数据成员n赋值为10 d.C::n=20; //D的对象成员 C的数据成员n赋值为20 cout<<d.getn()<<endl; //getn函数内,返回的是B的n ,所以理所当然的输出结果是10 return 0; }
运行结果:
2.修改后
因为 B和C都变成了虚拟基类 所以在D中的n实际上只是一个数据成员
所以第一次赋值为10,第二次赋值为20,实际是把第一次的赋值给修改掉了,所以最后输出结果为20,
知识点总结:
虚拟基类B,C中同名数据成员和成员函数,实际上都是最初始基类A的数据成员或成员函数
所以在派生类D中调用时相当于直接调用了基类A的数据成员或成员函数
标签:
原文地址:http://blog.csdn.net/destiny_forever/article/details/46042123