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

时间:2014-11-11 19:35:23

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

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

如果是这样的话,如果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 ; }
} ;

2 个答案:

答案 0 :(得分:4)

假设您想使用A作为常规界面,如果您不进行虚拟继承,那么您将无法执行此类操作,因为有从子A到基类D的两个继承路径:

int main()
{
    D d;
    const A& a = d;

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

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

答案 1 :(得分:1)

class B : public virtual A { } ;
class C : public virtual A { } ;

在中间类上使用虚拟继承,您的类D将只有一个A类实例,并且您的代码将编译得很好