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 { } ;