2

AFAIK,虚拟继承解决了菱形问题,但是如果我使用虚拟来简单地从基类继承呢?在这里使用有什么区别virtual

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

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

1 回答 1

2

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

虚拟继承是一个复杂的问题,您可能应该阅读更多在您的上一个问题的答案中提供的链接,而不是试图通过从单独的问题中获取零碎的内容来理解它。

提示:如果你想了解编译器如何处理虚拟继承的细节,你应该关注对象的内存布局。一旦你理解了为什么需要虚拟派生的每个类的额外指针,剩下的就很简单了。

于 2012-01-01T16:39:31.563 回答