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オブジェクトを作成しているので、我々は(我々が少なく、ほとんどの派生に派生から開始)HumanAnimalを構築し、最終的にCentaurCentaurを構築から始めます。

はのは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 

このCentaurAnimalから、その後Humanから最初を継承するため。

順序が逆であった場合、最初の例では2つのBiologyインスタンスが1つの行に構成されているのと同じ結果が得られました。

これの論理は何ですか?

あなたの方法を説明してください、私はすでにこれについて話しているたくさんのウェブサイトをチェックしました。しかし、誰も私の要求を満たしていないようです。

+2

どのような優れた質問ですか? – Hexaholic

答えて

関連する問題