菱形继承中遇到的疑惑

此程序运行结果是ACABD,
如果D先继承B,运行结果是AABCD,为什么不是ACABD啊?
如果C不是虚继承A,就是正常私继承A,运行结果就是ACABD了,这又是为什么呢?
C私有继承A,为什么D还可以调用构造函数A呀?


#include
using namespace std;
class MyClassA{
public:
    MyClassA( ) { cout<<"A";}
};
class MyClassB:public MyClassA{
public:
    MyClassB( ) { cout<<"B";}
};
class MyClassC:virtual private MyClassA{
public:
    MyClassC( ) { cout<<"C";}
};
class MyClassD:protected MyClassC,MyClassB{
public:
    MyClassD( ) { cout<<"D";}
};
int main(void )
{
    MyClassD t;
    system("pause");
    return 0;
}

不用太在意,因为不同平台继承模型可能会有区别,看我这里跑出来就是ACABD

img


若有帮助 ,点个采纳哦

回答不易 求求您采纳点赞哦 感激不尽

  • C++类的继承方式分为公有继承、私有继承、和虚继承。

  • 正常情况下,一个子类通过继承父类,父类的构造函数被调用,在子类的构造函数被调用。

  • 在本例中,当D继承B时,会先调用B的构造函数,再调用A的构造函数,所以输出为AABCD。

  • 如果C不是虚继承A,而是正常私有继承A,那么C的构造函数和A的构造函数都不会被D继承。所以输出结果为ACABD。

  • 在本例中,如果C私有继承A,D无法继承C的成员,但由于C是D的直接父类,所以D的构造函数依然会调用C的构造函数,从而间接地调用A的构造函数。