c++虚拟公共继承初始化奇怪的结果
c++ virtual public inheritance init strange result?
以下程序的输出为: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
。据我所知,继承是基于继承列表(而不是初始化列表)的顺序构建的,因此B
类首先用参数100
构建,然后用参数10
构建到类A
。所以现在A
将myInt
设置为值10
。类c
也是如此,因为myInt
是虚拟的,所以它被设置为数字600
。我从没想过5
。为什么会发生这种情况?
参见parashift:中的文章
因为虚拟基类子对象在例如,有一些特殊的规则来确保虚拟基础类的构造函数和析构函数每例子C++规则说虚拟基类是构造的在所有非虚拟基类之前。你作为一个程序员需要知道的是:任何地方的虚拟基类的构造函数在类的继承层次结构中,由"最派生的"调用类的构造函数。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- C++初始化的结果是什么?
- std::atomic_flag初始化结果
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- 即使在C 中越过初始化阵列的极限后,结果也是如此
- CUDA AtomicADD即使在初始化结果后也会产生错误的结果
- 初始化和显示整数向量时出现意外结果
- 使用函数调用结果在C++03中初始化多个成员
- 使用表达式的结果初始化对象时使用哪个构造函数
- 初始化变量时的不同结果
- 如何用函数的结果初始化静态成员数组
- 用两种不同的方式初始化指针会得到两种结果
- 如何使用c++ 11初始化函数结果的const向量?
- 使用中间结果初始化多个属性
- c++虚拟公共继承初始化奇怪的结果
- 我可以用函数调用的结果初始化一个全局变量吗
- 这两个矢量初始化是否实现相同的结果
- 在没有先前初始化的情况下使用映射订阅运算符的结果是否安全