У меня есть структура класса, которая выглядит следующим образом:
O
|
A
/ \
B C
\ /
D
|
E
И конструкторы работают следующим образом (конкретный код не включен для краткости, но я могу конкретизировать его, если это необходимо):
class O {
protected:
O(const string &str) {
//Does stuff with str
};
}
class A : public O {
protected:
A(const string &str) : O(str) { };
}
class B : public virtual A {
protected:
B(const string &str) : A(str) { };
}
class C : public virtual A {
protected:
C(const string &str) : A(str) { };
}
class D : public B, public C {
protected:
D(const string &str) : B(str), C(str) { };
}
class E : public D {
public:
E(const string &str) : D(str) { };
}
Предполагается, что классы O, A, B, C и D являются частью библиотеки, а класс D является базовым классом для любых классов, которые я создам позже (например, E). Единственная цель D — упростить наследование для таких классов, как E. Моя проблема в том, что конструктор E вызывает конструктор по умолчанию для A, если я явно не вызываю параметризованный конструктор A, что противоречит цели D.
Эта структура наследования лучше всего подходит для моего приложения, поскольку классы C и D используются для специализации инфраструктуры, созданной A и B. C содержит дополнительные методы для A.
Есть ли способ заставить D обрабатывать вызов параметризованного конструктора A? В идеале я хотел бы, чтобы инициализация E вызывала конструкторы A, B, C, D, E в указанном порядке. Строковый параметр очень важен для классов выше по течению от O, а конструкторы B и C должны запускать определенные функции.
A
конструктор по умолчанию? - person aschepler   schedule 12.01.2016