@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 просто как пример одного из таких классов.
  • Вопрос задан
  • 152 просмотра
Решения вопроса 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.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы