9

コードは次のとおりです。

コード :

#include <iostream>

using namespace std;

class Animal{
   int a;

    public:
    Animal(int a) : a(a){}
    int geta(){return a;}
};

class Bird : virtual public Animal{
    string b;
    public:
    Bird(int a , string b) : Animal(a) , b(b){}
};

class Fish : virtual public Animal{
    int f;
    public:
    Fish(int a , int f) : Animal(a) , f(f){}
};

class Unknown : public Bird, public Fish{
    char u;
    public:
    Unknown(int a , int f , string b , char u )
     : Bird(a , b) , Fish(a , f) , u(u){}  //Problem
};

質問 :

1.)Unknownクラスがインスタンス化された場合、どのようにすべてのスーパークラスを初期化しますか?Animalのインスタンスは1つしか作成されないので、mysefがコンストラクターを2回呼び出す必要がないようにするにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

17

最も派生したクラスは、仮想基本クラスを初期化します。クラス階層でUnknown、仮想Animal基本クラスを構築する必要があります(たとえばAnimal(a)、初期化リストに追加することによって)。

Unknownオブジェクトを作成するとき、コンストラクターを呼び出すことFishも、呼び出すこともありません。 仮想ベースのコンストラクターを呼び出します。BirdAnimalUnknownAnimal

于 2012-09-19T17:55:52.437 に答える