在C+中声明一个类+;作为「;最终:公共虚拟;有用吗? 当声明C++类为最终时,是否需要使用虚拟继承继承基类?我知道虚拟继承的用途,并使用它来避免成员重复
例如,如果我有这些类定义(假设它们都有一些成员和虚拟解构器) 将下一个类定义为在C+中声明一个类+;作为「;最终:公共虚拟;有用吗? 当声明C++类为最终时,是否需要使用虚拟继承继承基类?我知道虚拟继承的用途,并使用它来避免成员重复,c++,inheritance,virtual,final,virtual-inheritance,C++,Inheritance,Virtual,Final,Virtual Inheritance,例如,如果我有这些类定义(假设它们都有一些成员和虚拟解构器) 将下一个类定义为 class E final : public virtual D {} 或 或者是默认继承,即 class E final : public D {} class F final : public B, public C {}; 总是够了吗 这困扰了我很长一段时间,正如我不时看到的代码,包括 "final : public virtual" 在任何情况下虚拟的是否可以安全地省略 非常感谢任何提示/解释struc
class E final : public virtual D {}
或
或者是默认继承,即
class E final : public D {}
class F final : public B, public C {};
总是够了吗
这困扰了我很长一段时间,正如我不时看到的代码,包括
"final : public virtual"
在任何情况下虚拟的是否可以安全地省略
非常感谢任何提示/解释struct A{void foo(){cout,因为虚拟继承允许共享基类(即,只有一个实例),和final用于将类标记为不允许派生自…这两个对象相互独立。如果删除虚拟对象,则基类将不再共享。只考虑多重继承。是否可以提供(多重继承)例如,省略virtual
真的会有不同吗?有一个例子。想象一下struct Bat final:哺乳类动物,翼动物,虚拟动物
被更改为struct Bat final:哺乳类动物,翼动物,动物
…呜呜,Bat.eat()变得模棱两可。@Eljay“只关心多重继承。”不完全正确。Virtual模糊了直接基类和间接基类之间的区别。完美。这意味着,当不使用多重继承时,可以始终使用Virtual?@Ironbell是的,在此上下文中添加的Virtual
正是为了处理菱形问题。@Ironbell•我从未发现需要对混凝土b进行多重继承在C++ C++代码中,我使用了ASE类或抽象基类。我使用了多继承来拥有一个或唯一的一个具体的抽象的基类,以及多个接口类。(C++没有强制执行约束,它有一个<代码>接口< /Cord>关键字,因此它仅由惯例和规则来实现。@Eljay这不是一个关于是否以及何时使用MI的问题,而是这个组合是否有用。对于MI来说,一种尺寸并不适合所有尺寸。感谢你的回答,我很遗憾还没有足够的代表投票支持我的评论。“打电话给foo会很模糊”不仅如此(备注不适用于A
没有状态,也没有做很多事情的构造函数的简单示例)如果没有virtual,您甚至无法编写初始化基类子对象A
struct A { void foo() { cout << "foo" << endl; } };
struct B : virtual A {};
struct D final : virtual A, B {};
D d;
d.foo();
"final : public virtual"
struct A { void foo() { cout << "foo" << endl; } };
struct B : virtual A {};
struct D final : virtual A, B {};
D d;
d.foo();