【问题标题】:c++ virtual public inheritance init strange result? [duplicate]c++虚拟公共继承init奇怪的结果? [复制]
【发布时间】: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 .所以现在AmyInt 设置为值10。类c 也是如此,因为myInt 是虚拟的,所以它被设置为数字600。我没想到5。为什么会这样?

【问题讨论】:

  • 为什么不在你的构造函数中设置一个断点到 A,在调试器中启动程序并找出发生了什么?
  • @Thomas:调试无法解释为什么会发生这种情况,只能解释发生了什么。
  • 我希望你的生产代码不要使用这种反模式。

标签: c++


【解决方案1】:

parashift中的文章:

因为一个虚拟基类子对象只出现一次 例如,有一些特殊的规则来确保虚拟基地 类的构造函数和析构函数只被调用一次 实例。 C++ 规则说虚拟基类是构造的 在所有非虚拟基类之前。你作为程序员的事情 需要知道的是:任何地方的虚拟基类的构造函数 在您的类的继承层次结构中由“最派生”调用 类的构造函数。

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 2011-10-19
    • 2016-03-19
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2016-03-26
    • 2011-01-08
    相关资源
    最近更新 更多