В ромбовидной иерархии: виртуальный A → {B, C} → D, почему подклассы D не инициализируют A так же, как это делает D?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 В ромбовидной иерархии: виртуальный A → {B, C} → D, почему подклассы D не инициализируют A так же, как это делает D?

Сообщение Anonymous »

У меня следующий сценарий:

Код: Выделить всё

class A
{
public:
A(std::string id);
};

class B : public virtual A
{
public:
B();
};

class C : public virtual A
{
public:
C();
};

class D : public B, public C
{
public:
D(std::string id);
};

D::D(std::string id) : A(id), B(), C()
{
}

class X : public D
{
public:
X(std::string id);
}

X::X(std::string id) : D(id)
{
}
Теперь, если я создаю экземпляр D, все работает нормально. Однако, если я создаю экземпляр X, я получаю ошибку компилятора, которая сообщает мне, что что-то пытается вызвать конструктор по умолчанию A, которого не существует. Если я создаю его, он компилируется, но вызывается только конструктор по умолчанию и, соответственно, идентификатор неправильно устанавливается/инициализируется.

Это можно исправить, реализовав конструктор X следующим образом:

Код: Выделить всё

X::X(std::string id) : A(id), D(id)
{
}
Но я понимаю, что в этом нет необходимости. Так в чем же моя ошибка?

Подробнее здесь: https://stackoverflow.com/questions/145 ... f-d-initia
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»