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

问题及代码:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值