构造函数继承的虚拟继承

时间:2015-04-15 14:53:53

标签: c++ c++11 inheritance virtual-inheritance

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

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; };

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

然而,this does not work as written down above

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

甚至用更明确的版本is not enough替换InOutPort的定义:

struct InOutPort : InPort, OutPort { InOutPort(Module& m) : Port(m), InPort(m), OutPort(m) { } };

取而代之的是I seem to have to write down everything explicitly for it to work:

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

1 个答案:

答案 0 :(得分:1)

似乎没有办法做这样的事情。在12.9 / 8:

  

...隐式定义的继承构造函数执行set   由用户编写的类的初始化   具有mem-initializer-list的该类的内联构造函数   只有mem-initializer有一个mem-initializer-id来命名基数   using声明的nested-name-specifier中表示的类   和下面指定的表达式列表...

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

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