Это код:
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, мы начинаем с построения Centaur, создавая Human, Animal и, наконец, Centaur (мы начинаем с менее производного до самого полученного).
Пусть начнется с Human:
Human наследуется от Biology, поэтому сначала вызываем конструктор Biology.
Теперь, когда строится базовый класс Human, мы можем, наконец, построить сам Human.
Но вместо этого Biology снова создается!
Почему? Что происходит за кулисами?
Обратите внимание, что это было полностью умышленное удержание Animal, наследующее фактически от Biology, и в то же время оно также преднамеренно оставляло Human, не наследуя от Biology.
Мы решим Dreaded Diamond неверным образом: как Человек, так и Животное должны фактически наследовать Биологию, чтобы сделать эту работу.
Мне просто интересно.
Также см. этот код:
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;
}
Здесь мы имеем Human, наследуем фактически от Biology, а Animal устанавливается на наследование "классическим способом".
Но на этот раз выход отличается:
Biology CTOR
Human CTOR
Biology CTOR
Animal CTOR
Centaur CTOR
Это потому, что Centaur сначала наследует от Human и , а затем от Animal.
Если бы порядок был обратным, мы бы достигли того же результата, что и раньше, в первом примере - два экземпляра Biology, которые строятся в строке.
Какова логика этого?
Пожалуйста, попробуйте объяснить свой путь, я уже проверил множество сайтов, говорящих об этом. Но никто не удовлетворяет мою просьбу.