繁体   English   中英

C ++虚拟/非虚拟钻石继承

[英]c++ Virtual/Non-virtual Diamond inheritance

在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()被首先调用? 感谢您的帮助和提前解释。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM