3
class Base
{
      public:
          Base(){}
          Base(int k):a(k) 
          {     
          }
            int a;
};

class X:virtual public Base
{
      public:
            X():Base(10){}
            int x;
};

class Y:virtual public Base
{
      public:
            Y():Base(10){}
            int y;
};

class Z:public X,public Y
{
public:
    Z():X(10){}
};

int main()
{
           Z a;
           cout << a.a;
           return 1;
}

上記の場合、 forZ():X(10){} Base(int k):a(k)は呼び出していませんが、に変更するとZ():Base(10){}Base(int k):a(k)が呼び出されます。なんで ?

ありがとうございました。

4

3 に答える 3

7

キーワードを使用したため、virtualまさにそれが機能します。

の初期化との初期化を明確にするためにBase、 の初期化リストで明示的に初期化する必要があります。ZXY

于 2010-03-10T12:52:11.430 に答える
3

この質問を参照してください。要点は、仮想継承を使用する場合、基本クラスのコンストラクターを明示的に呼び出す必要があるということです。

于 2010-03-10T12:50:49.670 に答える
0

最も派生したコンストラクターの初期化子リストは、基本クラスを初期化するために使用されます。クラスZは共通の基本クラスを継承するクラスXとYを継承するため、データメンバーaにアクセスするときに明確にするために、仮想キーワードを使用して基本クラスのサブオブジェクトを1つだけ作成します。

于 2010-03-10T14:25:37.217 に答える