Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当基类不包含数据成员时,是否仍然需要虚拟继承?_C++_Oop_Inheritance_Multiple Inheritance_Virtual Inheritance - Fatal编程技术网

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

C++ 当基类不包含数据成员时,是否仍然需要虚拟继承?,c++,oop,inheritance,multiple-inheritance,virtual-inheritance,C++,Oop,Inheritance,Multiple Inheritance,Virtual Inheritance,缺少虚拟继承还会对以下代码产生负面影响吗 如果是这样,如果A类是否包含数据成员,那么负面影响是否与没有虚拟继承的多重继承的负面影响相同(或同样糟糕) class A { public : virtual ~A ( ) { } virtual int foo ( ) const = 0 ; } ; class B : public A { public : virtual ~B ( ) { } } ; class C : public A { public :

缺少虚拟继承还会对以下代码产生负面影响吗

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

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

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

    std::cout << a.foo() << " " << d.foo() << " " << std::endl;
}
intmain()
{
D;
常数A&A=d;
标准::cout

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

看起来,也就是说,如果您希望从B派生的指向a的指针具有与从C派生的指针相同的值。顺便说一句,您需要声明一个虚拟析构函数,其中包含一个空的implementatA中的ion。请参阅@Notinlist谢谢您的捕获。为了安全起见,我在A、B和C中添加了虚拟析构函数。
class B : public virtual A { } ;
class C : public virtual A { } ;