0

以下のプログラムの出力は次のとおりです。55

#include <iostream>
using namespace std;

struct A
{
public:
    int myInt;
    A(int n): myInt(n){}
    A(): myInt(5) {}
};


class B : virtual public A
{
public:
    B(int n):A(10) {}
    B():A(10) {}
};

class C : virtual public A
{
public:
    C(int n):A(3*n) {}
};

class D : public B, public C
{
public:
    D(int n=90) : C(2*n), B(n) {}
};

class E : public D
{
public:
    E(int n=20):D(n-1) {}
};

int main()
{
    D d(100);
    cout << d.myInt << endl;
    E e;
    cout << e.myInt << endl;
    return 0;
}

オブジェクトについて考えてみましょうd。私が理解していることから、継承は(初期化リストではなく)継承リストの順序に基づいて構築されるため、Bクラスは最初にパラメーターを使用100してクラスAに移動するパラメーターを使用して構築されます10。したがって、値をにA設定します。同じことがクラスにも当てはまり、仮想であるため、数値に設定されます。私は予想していなかった。なぜこうなった?myInt10cmyInt6005

4

1 に答える 1

0

parashiftの記事を参照してください。

仮想基本クラス サブオブジェクトはインスタンス内で 1 回だけ発生するため、仮想基本クラスのコンストラクターとデストラクタがインスタンスごとに 1 回だけ呼び出されるようにするための特別な規則があります。C++ の規則では、仮想基底クラスはすべての非仮想基底クラスの前に構築されると規定されています。プログラマーとして知っておく必要があるのは、クラスの継承階層内の任意の場所にある仮想基本クラスのコンストラクターは、「最も派生した」クラスのコンストラクターによって呼び出されるということです。

于 2013-02-16T13:25:58.690 に答える