【发布时间】:2013-02-16 13:12:47
【问题描述】:
下面程序的输出是: 5 5
#include <iostream>
using namespace std;
struct A
{
public:
int myInt;
A(int n): myInt(n){}
A(): myInt(5) {}
};
class B : virtual public A
{
public:
B(int n):A(10) {}
B():A(10) {}
};
class C : virtual public A
{
public:
C(int n):A(3*n) {}
};
class D : public B, public C
{
public:
D(int n=90) : C(2*n), B(n) {}
};
class E : public D
{
public:
E(int n=20):D(n-1) {}
};
int main()
{
D d(100);
cout << d.myInt << endl;
E e;
cout << e.myInt << endl;
return 0;
}
考虑对象d。据我了解,继承是根据继承列表(而不是初始化列表)的顺序构造的,因此首先使用参数100 构造B 类,该参数使用参数10 转到类A .所以现在A 将myInt 设置为值10。类c 也是如此,因为myInt 是虚拟的,所以它被设置为数字600。我没想到5。为什么会这样?
【问题讨论】:
-
为什么不在你的构造函数中设置一个断点到 A,在调试器中启动程序并找出发生了什么?
-
@Thomas:调试无法解释为什么会发生这种情况,只能解释发生了什么。
-
我希望你的生产代码不要使用这种反模式。
标签: c++