当基类不包含数据成员时,是不是仍然需要虚拟继承?
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 thevirtual
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 类的实例,你的代码可以正常编译
【讨论】:
以上是关于当基类不包含数据成员时,是不是仍然需要虚拟继承?的主要内容,如果未能解决你的问题,请参考以下文章