Задать вопрос
@Dead_Bit

Множественный вызов конструктора базового класса при виртуальном наследовании?

Имеется следующий код:

class A {
private: int a;
public: A(int a) : a(a) {}
};
class B : public virtual A {
private: void* b;
public: B(int a) : A(a) { b = malloc(8); }
};
class C : public virtual A {
private: void* c;
public: C(int a) : A(a) { c = malloc(16); }
};
class D : public C {
private: void* d;
public: D(int a) : C(a) { d = malloc(32); }
};


В конструкторе класса D возникает ошибка следующего содержания: "для класса A не существует конструктор по умолчанию".

Если добавить в конструктор D вызов конструктора A, то ошибка исчезает, но напрашивается вопрос "Будет ли конструктор базового класса A вызываться два раза, ведь в конструкторе C тоже вызывается конструктор A?".

class D : public C {
private: void* d;
public: D(int a) : A(a), C(a) { d = malloc(32); }
};


Заранее спасибо за ответ.

P. S. Такая иерархия классов мне нужна, так как одни классы у меня наследуются от B или C по отдельности, а другие наследуют сразу оба класса. Класс D просто как пример одного из таких классов.
  • Вопрос задан
  • 192 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++ расширенный
    12 месяцев
    Далее
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
напрашивается вопрос "Будет ли конструктор базового класса A вызываться два раза, ведь в конструкторе C тоже вызывается конструктор A?".


Нет, не будет, потому что нет, при конструировании объекта класса D конструктор A из конструктора C не вызывается. См.:
A mem-initializer where the mem-initializer-id denotes a virtual base class is ignored during execution of a constructor of any class that is not the most derived class.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Казань
от 75 000 до 125 000 ₽
Инком Нижний Новгород
от 160 000 до 230 000 ₽
Инком Нижний Новгород
от 160 000 до 230 000 ₽