C++ 虚拟继承

C++ 虚拟继承,c++,constructor,virtual-inheritance,C++,Constructor,Virtual Inheritance,如果我有 class Base1 {}; class Base2 {}; class Derived : public Base1, public Base2 {}; 然后,构造派生对象的构造函数调用的顺序是 Base1 Base2 i、 按它们出现的顺序排列 class Derived : public Base1, public Base2 {}; 但是如果我把它改成 派生类:public Base1,virtual public Base2{}; 然后,构造函数调用的顺序变为

如果我有

class Base1 {};

class Base2 {};

class Derived : public Base1, public Base2 {};
然后,构造派生对象的构造函数调用的顺序是

Base1
Base2 
i、 按它们出现的顺序排列

class Derived : public Base1, public Base2 {};
但是如果我把它改成 派生类:public Base1,virtual public Base2{}; 然后,构造函数调用的顺序变为

Base2
Base1
我不明白为什么会这样

另一个简单的疑问是:
虚拟继承Base1的意义和目的是什么。

这些只是规则。正在构造的最派生类首先初始化层次结构中的所有虚拟基类,然后再开始初始化其非虚拟直接基

这些规则来自标准ISO/IEC 14882:2011第12.6.2节[class.base.init]/10


这种方法的基本原理是确保所有基类都在其派生类之前初始化,无论它们是否为虚拟基类。

这些只是规则。正在构造的最派生类首先初始化层次结构中的所有虚拟基类,然后再开始初始化其非虚拟直接基

这些规则来自标准ISO/IEC 14882:2011第12.6.2节[class.base.init]/10


这种方法的基本原理是,它确保所有基类在其派生类之前初始化,无论它们是否为虚拟基类。

至于虚拟继承。当您有一个如下所示的派生类时,它开始发挥作用

class A {};
class B : public virtual A {} ;
class C : public virtual A {} ;
class D : B, C { }  // this class has only one instance of A!

又名钻石问题

至于虚拟继承。当您有一个如下所示的派生类时,它开始发挥作用

class A {};
class B : public virtual A {} ;
class C : public virtual A {} ;
class D : B, C { }  // this class has only one instance of A!

又名钻石问题

关于初始化顺序,Charles已经正确地回答了:这些是规则,首先是声明顺序中的虚拟基,然后是声明顺序中的非虚拟基,然后是声明顺序中的成员变量

虚拟继承的含义是什么?这意味着您的对象派生自该特定基,但如果在层次结构中,多个子对象的完整类型基实际上继承自同一基类型,则只会存在一个基子对象。您可以在那里阅读virtual关键字,因为我愿意与完整类型中的其他对象共享我的基础


根据第二个问题,您希望何时使用虚拟继承?无论何时在类型层次结构中,您可能会不止一次地从同一个基类继承,而在您的设计中,基类的所有引用都只是一次。一般来说,除了少数特殊情况外,使用虚拟继承是很少见的。

关于初始化顺序,Charles已经正确地回答了:这些是规则,首先是声明顺序中的虚拟基,然后是声明顺序中的非虚拟基,然后按照声明的顺序排列成员变量

虚拟继承的含义是什么?这意味着您的对象派生自该特定基,但如果在层次结构中,多个子对象的完整类型基实际上继承自同一基类型,则只会存在一个基子对象。您可以在那里阅读virtual关键字,因为我愿意与完整类型中的其他对象共享我的基础


根据第二个问题,您希望何时使用虚拟继承?无论何时在类型层次结构中,您可能会不止一次地从同一个基类继承,而在您的设计中,基类的所有引用都只是一次。一般来说,除了少数特殊情况外,使用虚拟继承是很少见的。

11个月了,你仍然无法正确格式化你的帖子?!一些帮助我假设你有一个拼写错误,因为你声明了Base1和Base2,但是使用了Base和Base1.11个月,所以你仍然不能正确格式化你的帖子?!一些帮助我假设您有一个输入错误,因为您声明了Base1和Base2,但随后使用Base和Base1。