在多级继承的情况下无法理解虚拟基类构造函数

Not able to understand virtual base class constructor in case of multilevel inheritance

本文关键字:虚拟 基类 构造函数 多级 继承 情况下      更新时间:2023-10-16

在下面的程序中,如果我更改派生类"D"中的序列,那么我将获得基类构造函数的不同顺序。

    #include <iostream>
    using namespace std;
    class A {
      public :
            A ()
            {
                cout << "A()" <<endl;
            }
    };
    class B : virtual A{
      public :
            B ()
            {
                cout << "B()" << endl;
            }
    };
    class C : virtual B{
      public :
            C ()
            {
                cout << "C()" << endl;
            }
    };
Case (1)
========
    class D : public A, public B, public C
    {
    };
    int main()
    {
        D d;
        return 0;
    }
OUTPUT : 
A()
B()
A()
B()
C()
Case (2)
========
    class D : public C, public B, public A
    {
    };
    int main()
    {
        D d;
        return 0;
    }
OUTPUT :
A()
B()
C()
B()
A()
Case (3)
========
    class D : public B, public A, public C
    {
    };
    int main()
    {
        D d;
        return 0;
    }
OUTPUT :
A()
B()
B()
A()
C()

请谁能说出在虚拟类概念的情况下如何调用构造函数。

请谁能说出在虚拟类概念的情况下如何调用构造函数。

根据初始化顺序,首先初始化虚拟基类。

1( 如果构造函数用于派生最多的类,则虚拟基 类按它们出现的顺序进行初始化 基类声明的深度优先从左到右遍历 (从左到右是指基本说明符列表中的外观(

2(然后,直接基类按从左到右的顺序初始化为 它们出现在此类的基本说明符列表中

3(然后,非静态数据成员按以下顺序初始化: 类定义中的声明。

4(最后,执行构造函数的主体

在所有 3 种情况下,类 D 继承自 ABCD中有两个虚基类,即 A通过BC继承,B通过C继承。A将首先初始化,因为它是最基的类,因此对于所有 3 种情况,首先将打印出A()B()

之后,直接基类将按从左到右的顺序初始化。对于第一种情况,它们将被A() B() C(),对于第2种情况,它们将被B() C() A(),对于第三种情况,它们将被B() A() C()

虚拟基总是在 DFS 后序中首先初始化。这保证了虚拟 A 和 B 碱基将首先初始化,A 在 B 之前初始化,因为 B 是从 A 派生的。之后,三个非虚拟碱基 A、B、C 按照您的预期简单地按声明顺序初始化。