虚基类数据成员

jac*_*hab 8 c++ virtual inheritance

为什么建议不要在虚拟基类中拥有数据成员?

功能成员怎么样?如果我有一个所有派生类共同的任务,虚拟基类可以执行任务,还是派生继承自两个类 - 从虚拟接口和执行任务的普通基类?

谢谢.

iai*_*ain 11

作为一种实践,您应该仅使用虚拟继承来定义接口,因为它们通常与多重继承一起使用,以确保派生类中只存在该类的一个版本.纯接口是多重继承的最安全形式.当然,如果您知道自己在做什么,可以根据需要使用多重继承,但如果不小心,可能会导致代码变弱.

虚拟继承的最大缺点是它们的构造函数是否接受参数.如果必须将参数传递给虚基类的构造函数,则强制所有派生类显式调用构造函数(它们不能依赖于调用构造函数的基类).

我可以看到您明确建议的唯一原因是虚拟基类中的数据可能需要构造函数参数.

编辑 我在马丁发表评论后做了一些家务,感谢马林.第一行不太正确:

作为一种实践,您应该仅使用虚拟继承来定义接口,因为它们通常与多重继承一起使用,以确保派生类中只存在该类的一个版本.

如果基类是纯接口,则虚拟继承没有区别(除了稍微不同的编译器错误,在vc8中,如果没有实现所有方法).如果基类有数据,它只会产生真正的差异,在这种情况下,你最终得到的是钻石而不是U形

Non virtual    virtual
  A     A          A
  |     |        /   \
  B     C       B     C
   \   /         \   /
     D             D
Run Code Online (Sandbox Code Playgroud)

在虚拟情况下,B和C共享相同的A副本.

但是我仍然同意纯接口是最安全的多重继承形式的所有其他内容,即使它们不需要虚拟继承.而构造函数参数和虚拟继承是一个痛苦的事实.