当基类不包含数据成员时,是不是仍然需要虚拟继承?

Posted

技术标签:

【中文标题】当基类不包含数据成员时,是不是仍然需要虚拟继承?【英文标题】:Is virtual inheritance still necessary when base classes contain no data members?当基类不包含数据成员时,是否仍然需要虚拟继承? 【发布时间】:2014-11-11 19:35:23 【问题描述】:

以下代码是否仍会因缺少虚拟继承而受到负面影响?

如果是这样,如果class A 确实包含数据,那么负面影响是否与没有虚拟继承的多重继承的负面影响相同(或一样糟糕)会员?

class A

public :
    virtual ~A ( )  
    virtual int foo ( ) const = 0 ;
 ;

class B : public A

public :
    virtual ~B ( )  
 ;

class C : public A

public :
    virtual ~C ( )  
 ;

class D : public B , public C

public :
    virtual int foo ( ) const  return 12 ; 
 ;

【问题讨论】:

它看起来 like you do need the virtual see here,也就是说,如果您希望从 B 派生的指向 A 的指针与从 C 派生的指针具有相同的值。 对了,需要在A中声明一个虚析构函数,实现为空。见***.com/questions/461203/… @Notinlist 谢谢你的收获。为了安全起见,我在 A、B 和 C 中添加了虚拟析构函数。 【参考方案1】:

假设您想使用A 作为通用接口,如果您不将继承设为虚拟,您将无法执行此类操作,因为有两个 继承从子 D 到基类 A 的路径:

int main()

    D d;
    const A& a = d;

    std::cout << a.foo() << " " << d.foo() << " " << std::endl;

如果您不需要将D 用作A,那么(A)为什么首先将它作为抽象基础和(B)不,不需要继承是虚拟的。

【讨论】:

【参考方案2】:
class B : public virtual A   ;
class C : public virtual A   ;

在中间类上使用虚拟继承,你的 D 类将只有一个 A 类的实例,你的代码可以正常编译

【讨论】:

以上是关于当基类不包含数据成员时,是不是仍然需要虚拟继承?的主要内容,如果未能解决你的问题,请参考以下文章

当基类提供时,派生类是不是需要实现移动语义?

基类不完整的继承

虚基类在解决二义性中的问题中的作用是啥

19.理解虚基类虚继承

析构函数 声明为protected

继承对基类私有数据成员的访问(在派生类中继承基类成员函数)