第十二周阅读程序4:虚基类-同名数据成员

来源:互联网 发布:慧通网络直播聊天室 编辑:程序博客网 时间:2024/05/16 13:46

问题及代码:

(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的数据成员或成员函数

 

0 0
原创粉丝点击