У меня есть иерархия классов, которая сводится к
class Module { };
struct Port {
Module& owner;
Port(Module& owner) : owner(owner) {}
};
struct InPort : virtual Port { using Port::Port; };
struct OutPort : virtual Port { using Port::Port; };
struct InOutPort : InPort, OutPort { using Port::Port; };
Как вы можете видеть, я бы предпочел создать некоторую базовую функциональность и наследовать ее в классическом алмазном узоре. Я также хотел бы использовать наследование конструктора, чтобы сделать его возможным как можно более вероятным...
Однако это не работает, как указано выше
prog.cpp: In function 'int main()':
prog.cpp:14:15: error: use of deleted function 'InOutPort::InOutPort(Module&)'
InOutPort p(m);
Даже заменить определение InOutPort
на более явную версию недостаточно):
struct InOutPort : InPort, OutPort { InOutPort(Module& m) : Port(m), InPort(m), OutPort(m) { } };
Вместо Мне кажется, что я должен явно записать все, чтобы он работал::
struct InPort : virtual Port { InPort(Module& m) : Port(m) { } };
struct OutPort : virtual Port { OutPort(Module& m) : Port(m) { } };
struct InOutPort : InPort, OutPort { InOutPort(Module& m) : Port(m), InPort(m), OutPort(m) { } };
Есть ли способ объединить наследование constuctor с виртуальным наследованием, которое я игнорирую?
Если нет, какую альтернативу вы бы использовали?
Может быть, конструкторы вариационных шаблонов, которые отлично пересылают свои аргументы во все базы?