【发布时间】:2018-07-03 13:44:57
【问题描述】:
当将 c++ 类声明为 final 时,是否需要使用虚拟继承来继承基类?我知道虚拟继承的用途并使用它来避免成员重复。
例如,如果我有这些类定义(想象它们都有一些成员和虚拟解构器)
class B : public virtual A {};
class C : public virtual A {};
class D : public virtual C {};
定义下一个类是否有意义
class E final : public virtual D {}
或
class F final : public virtual B, public virtual C {};
或者是默认继承,即
class E final : public D {}
class F final : public B, public C {};
总是够了吗?
这已经困扰了我很长时间,正如我不时看到的代码,其中包括
"final : public virtual"
virtual 在任何情况下可以安全地省略吗?
非常感谢任何提示/解释
【问题讨论】:
-
由于虚拟继承允许共享基类(即只有一次实例),而final用于标记一个类不允许派生......这两件事是彼此独立。如果删除虚拟,则不再共享基类。只关心多重继承。
-
您能否提供一个(多重继承)示例,其中省略
virtual真的会产生影响? -
en.wikipedia.org/wiki/Virtual_inheritance 有一个例子。想象一下
struct Bat final : Mammal, WingedAnimal, virtual Animal被更改为struct Bat final : Mammal, WingedAnimal, Animal...哎呀,bat.eat() 变得模棱两可。 -
@Eljay "只关心多重继承。" 不完全是。 Virtual 模糊了直接基类和间接基类之间的区别。
标签: c++ inheritance virtual final virtual-inheritance