构造函数继承的虚拟继承

gha*_*.st 14 c++ inheritance virtual-inheritance c++11

我有一个类层次结构,归结为

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; };
Run Code Online (Sandbox Code Playgroud)

如您所见,我更愿意创建一些基本功能,并以经典的菱形图案继承它.我也想使用构造函数继承使其尽可能地证明未来...

但是,这不起作用如上所述

prog.cpp: In function 'int main()':
prog.cpp:14:15: error: use of deleted function 'InOutPort::InOutPort(Module&)'
  InOutPort p(m);
Run Code Online (Sandbox Code Playgroud)

InOutPort使用更明确的版本替换定义也是不够的:

struct InOutPort : InPort, OutPort { InOutPort(Module& m) : Port(m), InPort(m), OutPort(m) { } };
Run Code Online (Sandbox Code Playgroud)

相反,我似乎必须明确记下所有内容才能使其工作:

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) { } };
Run Code Online (Sandbox Code Playgroud)

有没有办法将constuctor继承与我忽略的虚拟继承相结合?
如果没有,你会用什么替代品?
也许variadic模板构造函数可以完美地将其参数转发给所有基础?

Mar*_*k B 1

似乎没有什么办法可以做到这样的事情。在 12.9/8 中:

...隐式定义的继承构造函数执行该类的一组初始化,这些初始化将由该类的用户编写的内联构造函数执行,该类具有 mem-initializer-list,其中唯一的 mem-initializer-id 具有 mem-initializer-id命名 using 声明的嵌套名称说明符中表示的基类和下面指定的表达式列表...

换句话说,您继承的构造函数的类是唯一将参数转发给它的基类。所有其他基类都需要有默认构造函数。由于您通过继承父构造函数将这些默认构造函数隐藏在中间类中,因此一旦显式继承父构造函数,就无法调用它们。

我认为您应该能够对两个中间类使用继承的构造函数,并且只为最派生的类编写显式版本[我没有看到您已经尝试过这个 - 从我对标准的理解来看,它确实看起来像是一个编译器错误]。如果我想到另一种更好的方法,我会更新。