在一般的继承体系下,子类构造函数成员列表中只能出现直接父类的构造函数,而不会间接父类以上的构造函数。尽管如此它仍能够在类的继承体系中传递信息。
不过,这在虚拟继承下是行不通的。因为子类可能通过不同的继承路径把相同的信息传递到共同的祖先,这极有可能引起冲突。为防止此种情况出现C++针对虚拟继承废除了子类信息在类的继承体系中自动传递的机制。换句话说,在虚拟继承环境下子类信息只能传递到直接父类而已。这个时候共同的那个祖先只能调用自己的default构造函数了。
如下图所示:
测试程序及结果如下:
如果信息真的能传递到base,那么base的base(int _a)会被调用从而打印This is not default base()但是从结果来看,这条句子没有出现,因此在虚拟继承下子类构造函数信息真的无法传达到共同祖先构造函数。
如果你非要把信息传递到共同的祖先,那你就在子类中显式调用祖先的指定构造函数吧。如下图所示:
红框中的代码是新添加的,是base类的构造函数。
现在测试代码不变,再看测试结果。
如上图所示,base类的构造函数被调用。
不过这招仅对虚拟继承能用。
所以,这说明在有虚拟继承时,你需要显式地调用间接基类的构造函数来完成信息的传递。