【问题标题】: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中声明一个虚析构函数,实现为空。见stackoverflow.com/questions/461203/…
  • @Notinlist 谢谢你的收获。为了安全起见,我在 A、B 和 C 中添加了虚拟析构函数。

标签: c++ oop inheritance multiple-inheritance virtual-inheritance


【解决方案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 类的实例,你的代码可以正常编译

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2011-04-26
      • 2023-04-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多