AFAIK,虚拟继承解决了菱形问题,但是如果我使用虚拟来简单地从基类继承呢?在这里使用有什么区别virtual
?
class A
{
/* ... */
};
class B : virtual public A
{
/* ... */
};
AFAIK,虚拟继承解决了菱形问题,但是如果我使用虚拟来简单地从基类继承呢?在这里使用有什么区别virtual
?
class A
{
/* ... */
};
class B : virtual public A
{
/* ... */
};
有一些区别。对象布局会不同(在虚拟继承的情况下,派生的子对象中会有一个额外的隐藏指针指向基类),子对象的初始化会有所不同(派生的类型必须在初始化时直接B
调用A
构造函数列表)。B
成员函数中引用成员(数据或函数)的任何代码A
都需要额外的间接(通过前面提到的指针),可能还有其他差异。
虚拟继承是一个复杂的问题,您可能应该阅读更多在您的上一个问题的答案中提供的链接,而不是试图通过从单独的问题中获取零碎的内容来理解它。
提示:如果你想了解编译器如何处理虚拟继承的细节,你应该关注对象的内存布局。一旦你理解了为什么需要虚拟派生的每个类的额外指针,剩下的就很简单了。