多重继承的情况下的执行顺序

neh*_*ika 4 c++ multiple-inheritance

class A: public B, public C { };
Run Code Online (Sandbox Code Playgroud)

在这种情况下,执行顺序是:

B(); // base(first)  
C(); // base(second)  
A(); // derived
Run Code Online (Sandbox Code Playgroud)
class A: public B, virtual public C { }; 
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,当我在继承时用c类写虚拟时,顺序为

// execution becomes:  
C(); // virtual base  
B(); // ordinary base  
A(); // derived
Run Code Online (Sandbox Code Playgroud)

我已经读过某个地方,调用构造函数的顺序依赖于声明的顺序,同时继承多个类但是如何在用类编写虚拟时改变执行的顺序.我无法理解为什么我得到这样的结果.

Dan*_*n R 5

始终根据C++标准首先执行虚拟基类构造函数.从工作草案N3242,第272页第10行,我们了解到:

  • 虚拟基类构造函数首先按照继承图的从左到右的深度优先遍历的顺序排在第一位.
  • 接下来是直接基类,按声明顺序排列.

因此,您看到的行为正是C++标准所要求的.这是有道理的,因为虚拟基类可能在继承中出现多次,当然它们每个只能构造一次.因此,必须有一个初始的虚拟基类构造,然后是通常的非虚基类构造.

这个页面上也有一个很好的解释.