【问题标题】:Inheriting constructors of virtual base classes继承虚拟基类的构造函数
【发布时间】:2015-10-06 10:20:47
【问题描述】:

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

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 中的错误吗?

【问题讨论】:

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


【解决方案1】:

这是 gcc 错误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) 构造函数。

【讨论】:

  • 当然,如果 base 不能被默认构造,这仍然行不通......所以看来解决这个问题的唯一方法是手动重新定义所有派生类中的构造函数。
猜你喜欢
  • 2013-10-24
  • 2015-06-21
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2018-04-18
  • 2021-06-02
相关资源
最近更新 更多