Это код:Смешивание виртуальной и не виртуальное наследование базового класса
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
«s первым. Теперь, когда построен базовый класс Human
, мы можем, наконец, построить сам Human
. Но вместо этого Biology
снова строится!
Почему? Что происходит за кулисами?
Пожалуйста, обратите внимание, что это было полностью преднамеренным оставляя Animal
наследованию практически от Biology
и, в то же время, это было также намеренным оставив Human
без практически унаследовав от Biology
.
Мы решаем страшился Алмаз в неверном пути: как человек и животные должны практически наследовать биологии, чтобы сделать эту работу.
Мне просто интересно.
Также см этот код:
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
, построенные в строке.
Какова логика этого?
Пожалуйста, попробуйте объяснить свой путь, я уже проверил множество сайтов, говорящих об этом. Но никто не удовлетворяет мою просьбу.
Какой прекрасный вопрос! – Hexaholic