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