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。