问题及代码:
(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的数据成员或成员函数