基类的虚拟继承

时间:2012-01-01 16:14:32

标签: c++ virtual-inheritance

AFAIK,虚拟继承解决了钻石问题,但是如果我使用virtual来简单地从基类继承呢?在这里使用virtual有何不同?

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

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

1 个答案:

答案 0 :(得分:2)

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

虚拟继承是一个复杂的问题,您应该阅读上一个问题的答案中提供的更多链接,而不是通过从单独的问题中获取点点滴滴来了解它。

提示:如果要了解编译器如何处理虚拟继承的详细信息,则应关注对象的内存布局。一旦你理解为什么需要虚拟派生的每个类的额外指针,其余的都很简单。