35. C++ Виртуальное множественное наследование (ромбовидное наследование)

Виртуальное множественное наследование (ромбовидное наследование)

В предыдущей теме (множественное наследование) мы создавали классы студента и работника и наследовали от них класс работающего студента, при этом все поля классов были различными.

Представим, что у нас было бы более сложное наследование, например:
классы студент и работник наследуются от класса 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, т.е. получается фигура как на картинке (ромб).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *