【发布时间】:2015-06-01 05:44:28
【问题描述】:
我正在尝试更好地理解虚拟继承的概念,以及它的危险。
我在另一篇文章 (Why is Default constructor called in virtual inheritance?) 中读到它(= 虚拟继承)改变了构造函数调用的顺序(首先调用“祖母”,而没有虚拟继承则不会)。
所以我尝试了以下方法,看看我明白了(VS2013):
#define tracefunc printf(__FUNCTION__); printf("\r\n")
struct A
{
A(){ tracefunc; }
};
struct B1 : public A
{
B1(){ tracefunc; };
};
struct B2 : virtual public A
{
B2() { tracefunc; };
};
struct C1 : public B1
{
C1() { tracefunc; };
};
struct C2 : virtual public B2
{
C2() { tracefunc; };
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pa1 = new C1();
A* pa2 = new C2();
}
输出是:
A::A
B1::B1
C1::C1
A::A
B2::B2
C2::C2
这不是我所期望的(我预计 2 个类的顺序会有所不同)。
我错过了什么?有人可以解释或指导我找到解释更好的来源吗?
谢谢!
【问题讨论】:
-
你期待什么? “祖母”总是先被叫到。你使用什么样的继承并不重要。如果不同,低级类如何在其构造函数中使用父级的数据?
-
虚拟继承仅在多重继承的情况下有所不同。提供它是为了通过继承图共享一些结构。
标签: c++ inheritance virtual-inheritance