Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中声明一个类+;作为「;最终:公共虚拟;有用吗? 当声明C++类为最终时,是否需要使用虚拟继承继承基类?我知道虚拟继承的用途,并使用它来避免成员重复_C++_Inheritance_Virtual_Final_Virtual Inheritance - Fatal编程技术网

在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();