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