Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Наследование в С++

#наследование #cpp


Есть вот такой вот код (пример):
class A{
     public:
         A(int x,int y){//конструктор с параметрами
             //nothing...
         }
 };

class B:public virtual A{
    public:
        B(int x,int y,int z):A(x,y){//констрктор, в котором вызываются конструктор
родитля, все логчно
            //nothing...
        }
};

class C:public virtual B{
    public:
        C(int x,int y,int z,int value):B(x,y,z),A(x,y){//вот только так работает
            //nothing...
        }

};

Почему в классе С приходится писать вызов коструктор A. Почему он не может вызваться
из класса B?
Есть какое-то подозрение, будто это связано с виртуальным наследованием. Но хочу
узнать наверняка.    


Ответы

Ответ 1



Вы правильно догадываетесь - это связано именно с виртуальным наследованием, т.к. в этом случае инициализация виртуального базового класса происходит в самом дальнем по иерархии потомке, в вашем случае в классе C. В этом-то и есть смысл виртуальных базовых классов - они присутствуют в объекте производного класса только в одном экземпляре. Активно используется при множественном наследовании от классов, имеющих общий базовый класс. В вашем случае это, скорее всего, лишнее.

Комментариев нет:

Отправить комментарий