【问题标题】:When will compiler generate default constructor for a derived class编译器何时为派生类生成默认构造函数
【发布时间】:2011-08-13 23:33:56
【问题描述】:

这是我的观察:

编译器不会为基类定义了构造函数的派生类生成默认构造函数。

// example
class ClassCBase
{
public:
    ClassCBase(int i) {}
};

class ClassC : public ClassCBase
{

};

int main()
{
  ClassC c; // error C2512: 'ClassC' : 
                // no appropriate default constructor available
}

Q1>我理解正确吗?

Q2>是否存在编译器不会为派生类生成默认构造函数的其他情况?

【问题讨论】:

标签: c++


【解决方案1】:

如果超类没有默认构造函数,编译器不会生成默认构造函数。换句话说,由于超类构造函数需要一个参数,并且不能期望编译器知道合适的默认值是什么,编译器将无法生成有用的默认构造函数。但是,如果您向ClassCBase 添加了一个无参数构造函数,ClassC 将可以按原样使用。

【讨论】:

  • 它会生成一个(只要没有其他构造函数)但是构造函数的生成会导致编译时错误,因为它要求超类有一个无参数的构造函数。
  • 编译器是否声明/定义默认构造函数没有什么价值。标准说程序格式错误,由每个编译器选择如何报告错误。
【解决方案2】:

如果基类没有默认构造函数,编译器不会为派生类定义隐式默认构造函数(不仅仅是“声明”,定义是这里的关键)。 (任何可以不带参数调用的构造函数都是默认构造函数,无论实际签名如何,只要提供了默认参数。)

所以我们可以总结出 any 类的要求,以拥有一个格式良好的隐式定义的构造函数:

  • 没有 const 成员。
  • 没有参考成员。
  • 所有基类都必须具有可访问的默认构造函数。
  • 所有非静态成员都必须具有可访问的默认构造函数。

【讨论】:

  • 可以说,如果使用派生类,编译器会为派生类定义一个默认的构造函数,但是因为它需要生成的构造函数是非良构的,所以程序是非良构的。跨度>
  • @Charles:确实,我在文本中添加了“格式良好”。
  • 想想第一段,也许“编译器将无法定义...”更好地描述了因果关系。我不确定。
  • @Charles:好吧,鉴于您刚才所说,编译器定义Foo::Foo() : {}的等价物。只是无法进行实际的构建过程。这是 2003/12.1.7 吗?有点不透明……
  • 嗯,不知何故,FDIS 中的 12.1.6 稍微清晰一点。哎呀,我忘了会员! :-)
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2014-03-12
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多