class Animal {
public:
Animal(const char * color, int childs, float avgLifetime) {
//Do something
}
};
class Birds: virtual public Animal {
public:
Birds(const char * color, int childs, float avgLifetime, float incubation)
: Animal(color, childs, avgLifetime) {
//Do something
}
};
class Flamingo: public Birds {
public:
Flamingo(const char * color, int childs, float avgLifetime, float incubation, float avgHeight)
: Animal(color, childs, avgLifetime),
Birds(color, childs, avgLifetime, incubation) {
//Do something
}
};
新しいものFlamingo
を作成しようとすると、Animal
コンストラクターをスキップしました。その相続人が仮想
だからだと思いBirds
ますAnimal
。
私はそれが順番に到着すると思いました:
Animal->Birds->Flamingo
なぜAnimalコンストラクターをスキップするのですか?
でBirds
仮想継承を使用するためAnimal
、の派生はBirds
で仮想継承も使用しAnimal
ます。特に:
class Flamingo : public Birds { /* ... */ };
暗黙的に次と同等です:
class Flamingo : virtual Animal, public Birds { /* ... */ };
また、明示的に記述した場合はFlamingo
、コンストラクターを呼び出すためのコードを追加することを期待していましたAnimal
(または、のデフォルトコンストラクターFlamingo
を暗黙的に呼び出すことができAnimal
ます)。さらに、インスタンスのFlamingo
's初期化は'をAnimal
オーバーライドしますBirds
。
だから、初期化はまだですAnimal
→ Birds
→Flamingo
が、Animal
初期化は何でもありFlamingo
ません、そしてBirds
以来、初期化はスキップされ「Animal
すでに初期化されています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加