为什么这个程序的输出是40?
- 提问者网友:骨子里的高雅
- 2021-04-29 12:12
- 五星知识达人网友:行雁书
- 2021-04-29 12:31
虚继承的调用机制,你的源程序为:
#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.
- 1楼网友:往事埋风中
- 2021-04-29 15:16
不就是X40),反正就是X40)就是把x变为了40 所以输出是40
- 2楼网友:孤独的牧羊人
- 2021-04-29 13: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.