继承虚基类的构造函数
Inheriting constructors of virtual base classes
虚拟基类是在最派生的类中初始化的,所以我的猜测是继承基类的构造函数应该也可以工作:
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)
构造函数。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 具有已删除移动和复制构造函数的类的就地构造
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- C++构造函数和类?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在其他类中使用参数化构造函数制作类的对象?
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 如何使用私有构造函数对类进行单元测试?
- C++虚拟函数:基类函数是调用的,而不是派生的
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 继承的构造函数忽略类内初始化
- 模板和隐式构造函数的类定义之外的友元声明
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基继承?
- 具有多个非默认构造函数基的Singleton派生类
- 调用基默认构造函数模板类
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 构造所有基类不需要默认生成的构造函数