永发信息网

为什么这个程序的输出是40?

答案:3  悬赏:60  手机版
解决时间 2021-04-29 20:05
#includeclass X{public:int x; X(int a){x=a;}};class A:virtual public X{public:A(int a):X(a){}};class B:virtual public X{public:B(int a):X(a){}};class C:public A,public B{public:C(int a):A(20),B(30),X(40){}};void main(){ C c(40); cout<<c.x<<endl;}
最佳答案

虚继承的调用机制,你的源程序为:


#include<iostream.h>


class X


{public:int x;


X(int a){x=a;}


};


class A:virtual public X{public:A(int a):X(a){}


};


class B:virtual public X{public:B(int a):X(a){}};


class C:public A,public B{


public:C(int a):A(20),B(30),X(40){}


};


void main()


{ C c(40); cout<<c.x<<endl;}



首先,类X为基类,


其次,派生出子类A,B,类A虚继承类X,类B虚继承类X;


再者,类C多继承并且是公有继承类A和类B,


当执行类C的构造函数时,由于它的构造函数是用 初始化列表 形式,该形式


驱动了虚基类的构造函数,故忽略了类A,B构造函数的初始化参数表的调用,


直接基类A,B的构造函数是系统自动调用的,不受C类构造函数的参数表的影响。


这道题目中,类C是初始化参数列表,A(20),B(30)被忽略调用,只执行X(40)的初始化;


故结果为40.



全部回答

不就是X40),反正就是X40)就是把x变为了40 所以输出是40

#include<iostream.h>

class X

{public:int x;

X(int a){x=a;}

};

class A:virtual public X{public:A(int a):X(a){}

};

class B:virtual public X{public:B(int a):X(a){}};

class C:public A,public B{

public:C(int a):A(20),B(30),X(40){}

};

void main()

{ C c(40); cout<<c.x<<endl;}

这是虚基类机制,A和B继承了X,C又继承了A,B,C的类对象c调用构造函数初始化对象,先调用基类构造函数初始化基类,在初始化c,将40赋给了成员x,调用输出40.

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
手机怎么更改QQ个性签名?
为什么我打开DNF却出现
我下载网球王子中林樱的剧照,那里可以下载
农工商超市NO.3343地址有知道的么?有点事想
陕西榆林离河南虞城多少公里
请帮我,对女生最有杀伤力的一句话
风大阴天的句子,关于阴天的古诗
杭州哪家平面模特培训班好点
DNF血腥伊恩这个任务咋做
谁给一个用步步高H2能看的哈尔的移动城堡
铁腰杆重庆市主城区何处有售
夏天小孩子吃什么零食,夏天吃什么零食好?
围洼五龙庙怎么去啊,有知道地址的么
为什么我的QQ才18级那?
3世男人法满,转男人怎样把鬼法抗满?
推荐资讯
东方纸业集团东方造纸厂地址有知道的么?有点
着两件装备合成,能将副装备的两个洞合到主装
物理真的很难的一道题
山寨手机不能起动奇曲(冒泡)
求能看韩国SBS直播的网站或者软件。
世界上有多少国家可以和美国相提并论?
谁了解诺基亚手机6700S的功能
京珠高速公路路线图
武林外传现在还可以合情投意合装吗
为什么手机上QQ上传不了照片呢?每次都超时,
急求一首适合通俗唱的红歌,是红色歌曲!
男朋友在异地工作最近联系比较少,我很爱他,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?