Виртуальное множественное наследование (ромбовидное наследование)
В предыдущей теме (множественное наследование) мы создавали классы студента и работника и наследовали от них класс работающего студента, при этом все поля классов были различными.
Представим, что у нас было бы более сложное наследование, например:
классы студент и работник наследуются от класса Person (содержащего имя)
и от этих классов (студент и работник) наследуется класс работающего студента, что произойдет?
Фрагмент кода (схематично):
class Person
{
public:
string Name;
};
class Student : public Person {//code};
class Employer: public Person {//code};
class WorkingStudent : public Student, public Employer {//code};
В этом случае при создании классов Student и Employer будут созданы 2 разных!!! экземпляра класса Person, содержащие имя человека
И при наследовании у класса WorkingStudent внутри по факту будут объекты объекты классов Person1>Student и Person2>Employer, но по факту это один и тот же человек.
Важно отметить – такой вид наследования как обозначен выше тоже может использоваться, например если бы вместо поля «имя» было поле «идентификатор» тогда как у студента у человека был бы идентификатор ID xxxxx1, а как у работника другой ID xxxxx2
Но вернемся к классу Person и полю Name.
Чтобы исправить проблему при этом множественном наследовании – нужно немного изменить код, добавив ключевое слово virtual.
Фрагмент кода (схематично):
class Person
{
public:
string Name;
};
class Student : public virtual Person {//code};
class Employer: public virtual Person {//code};
class WorkingStudent : public Student, public Employer {//code};
Почему называется ромбовидное наследование:
Если расписать порядок наследования, то от Person наследуются Student Employer, а от них WorkingStudent, т.е. получается фигура как на картинке (ромб).
