【问题标题】:c++ Virtual/Non-virtual Diamond inheritancec++ 虚拟/非虚拟 Diamond 继承
【发布时间】:2013-07-31 21:15:02
【问题描述】:

给定以下 C++ 代码:

struct A {
    A() { f(0); }
    A(int i) { f(i); }
    virtual void f(int i) { cout << i; }
};
struct B1 : virtual A {
    B1(int i) : A(i) { f(i); }
    virtual void f(int i) { cout << i+10; }
};
struct B2 : virtual A {
    B2(int i) : A(i) { f(i); }
    virtual void f(int i) { cout << i+20; }
};
struct C : B1, virtual B2 {
    int i;
    C() : B1(6),B2(3),A(1){}
    virtual void f(int i) { cout << i+30; }
};

谁能解释为什么C* c = new C();会按顺序打印 1 23 然后 16 吗?它如何决定打印的顺序?我知道非虚拟的B1 将被最后调用,但为什么A() 首先被调用?感谢您提前提供的帮助和解释。

【问题讨论】:

标签: c++ virtual-inheritance diamond-problem


【解决方案1】:

因为您实际上继承了B2,所以编译器将首先构造它,以确定哪些变量在C 中被虚拟继承,然后再构造任何非虚拟继承(B1)。当然,A 会首先被构造,因为B2 在构造之前需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2011-01-08
    相关资源
    最近更新 更多