Это код:
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
, которые строятся в строке.
Какова логика этого?
Пожалуйста, попробуйте объяснить свой путь, я уже проверил множество сайтов, говорящих об этом. Но никто не удовлетворяет мою просьбу.