码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-27 10:07:27      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

问题及代码:

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

 

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

标签:

原文地址:http://blog.csdn.net/destiny_forever/article/details/46042123

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!