继承虚拟基类的构造函数

时间:2015-10-06 10:20:47

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

虚拟基类在最派生的类中初始化,所以我的猜测是继承基类的构造函数也应该有效:

struct base {
    base(int) {}
};

struct derived: virtual base {
    using base::base;
};

derived d(0);

然而,这无法使用GCC 5.2.0编译,它试图找到base::base(),但与Clang 3.6.2一起工作正常。这是GCC中的错误吗?

1 个答案:

答案 0 :(得分:5)

这是gcc bug 58751 [C ++ 11]继承构造函数无法与虚拟继承一起正常工作” (又名:63339使用构造函数”来自虚拟基础被隐式删除“):

来自58751说明:

  

在N2540号文件中,它指出:

     

通常,继承具有虚拟基础的类的构造函数定义将是不正确的,除非虚拟基础支持默认初始化,或虚拟基础是直接基础,并命名为转发的基础。同样,所有数据成员和其他直接库都必须支持默认初始化,否则任何使用继承构造函数的尝试都将是错误的。注意:使用时形成不良,未声明。

     

因此,委员会明确考虑虚拟基地的情况,因此应予以实施。

从错误报告中借鉴的解决方法:

struct base {
    base() = default;  // <--- add this
    base(int) {}
};

根据错误报告,在这种情况下,构造函数base::base(int)由隐式生成的构造函数derived::derived(int)调用。

我检查过your code无法编译。但是this会这样做,它会调用base::base(int)构造函数。