C++语言标准,对于虚继承的实现并未做出要求,这依赖于具体编译器的实现。大部分编译器的实现如下:
class A{};
class B : virtual public A{};
class C: virtual public A{};
class D: public classB,public classC{};
class E: public class D{};
int main()
{
E object;
return 0;
}
这段代码中E对象object的内存布局如下:
这表明了,相对于非虚继承(钻石)继承,使用虚继承的派生类,在利用多态性带来的便利时,同时也隐藏着的巨大风险。如在将A的指针强转成E的指针时,使用c-style的转换,甚至是c++的非dynamic_cast都是错误,对于不关注或无法关注实现结构的对象使用时,可能导致运行时崩溃。