23
これはコードである:基底クラスの仮想および非仮想継承ミキシング
struct Biology
{
Biology() { cout << "Biology CTOR" << endl; }
};
struct Human : Biology
{
Human() { cout << "Human CTOR" << endl; }
};
struct Animal : virtual Biology
{
Animal() { cout << "Animal CTOR" << endl; }
};
struct Centaur : Human, Animal
{
Centaur() { cout << "Centaur CTOR" << endl; }
};
int main()
{
Centaur c;
return 0;
}
このコード印刷:
Biology CTOR
Biology CTOR
Human CTOR
Animal CTOR
Centaur CTOR
なぜ?
我々はCentaur
オブジェクトを作成しているので、我々は(我々が少なく、ほとんどの派生に派生から開始)Human
、Animal
を構築し、最終的にCentaur
でCentaur
を構築から始めます。
はのはHuman
から始めましょう:Biology
から Human
継承ので、我々は最初のBiology
のコンストラクタ呼び出します。 Human
の基本クラスが構築されたので、最後にHuman
を構築することができます。 代わりにBiology
が再構築されます。
なぜですか?背後には何が起こっていますか?
はそれがHuman
は非事実上
Biology
から継承したまま意図的でもあった、それは同時に、
Biology
からほぼ継承し、
Animal
を残して完全に意図的だったことに注意してください。
我々は間違った方法で恐ろしいダイヤモンドを解決している:人間と動物の両方が事実上、この作業をするために生物学を継承しなければならない。
私は興味があります。
また、このコードを参照してください。
ここstruct Biology
{
Biology() { cout << "Biology CTOR" << endl; }
};
struct Human : virtual Biology
{
Human() { cout << "Human CTOR" << endl; }
};
struct Animal : Biology
{
Animal() { cout << "Animal CTOR" << endl; }
};
struct Centaur : Human, Animal
{
Centaur() { cout << "Centaur CTOR" << endl; }
};
int main()
{
Centaur c;
return 0;
}
Animal
は「古典的なやり方」に継承するように設定されている間、我々は、Biology
から事実上継承Human
を持っています。
しかし、今回、出力は異なります。
Biology CTOR
Human CTOR
Biology CTOR
Animal CTOR
Centaur CTOR
このCentaur
はAnimal
から、その後Human
とから最初でを継承するため。
順序が逆であった場合、最初の例では2つのBiology
インスタンスが1つの行に構成されているのと同じ結果が得られました。
これの論理は何ですか?
あなたの方法を説明してください、私はすでにこれについて話しているたくさんのウェブサイトをチェックしました。しかし、誰も私の要求を満たしていないようです。
どのような優れた質問ですか? – Hexaholic