继承虚基类的构造函数

Inheriting constructors of virtual base classes

本文关键字:构造函数 基类 继承      更新时间:2023-10-16

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

struct base {
    base(int) {}
};
struct derived: virtual base {
    using base::base;
};
derived d(0);

然而,这在GCC 5.2.0中无法编译,GCC 5.2.0试图找到base::base(),但在Clang 3.6.2中可以正常工作。这是GCC中的一个bug吗?

这是gcc的错误58751[c++ 11]继承构造函数在使用虚拟继承时不能正常工作(又名:63339使用构造函数"从虚基中隐式删除"):

来自58751的描述:

在文件N2540中指出:

通常,继承带有虚基的类的构造函数定义将是错误的,除非虚基支持默认初始化,或者虚基是直接基,并被命名为forward -to基。同样,所有数据成员和其他直接基必须支持默认初始化,否则任何使用继承构造函数的尝试都将是错误的。注意:使用时格式错误,未声明。

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

从bug报告中借用的解决方法:

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

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

我已经检查了你的代码不能编译。但是这样做,它调用base::base(int)构造函数。