2012-01-01 163 views
2

AFAIK,虚拟继承解决钻石问题,但如果我使用虚拟从基类继承?在这里使用virtual有何区别?从基类虚拟继承

class A 
{ 
    /* ... */ 
}; 

class B : virtual public A 
{ 
    /* ... */ 
}; 

回答

2

有一些差异。对象布局将会有所不同(在虚拟继承的情况下,会有一个额外的隐藏指针指向派生子对象中的基础),子对象的初始化将有所不同(来自B的类型将不得不直接调用A构造函数初始化列表)。在B中引用A成员(数据或函数)的成员函数中的任何代码将需要额外的间接寻址(通过之前提到的指针)以及其他可能的差异。

虚拟继承是一件复杂的事情,您应该阅读前面问题的答案中提供的更多链接,而不是试图通过从单独的问题中获得零散的东西来理解它。提示:如果你想了解编译器如何处理虚拟继承的细节,你应该关注对象的内存布局。一旦你明白了为什么每个类需要的额外指针是虚拟的,其余的都很简单。