编译器何时为派生类生成默认构造函数

时间:2011-08-13 23:33:56

标签: c++

以下是我的观察:

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

// 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>是否存在编译器不会为派生类生成默认构造函数的任何其他情况?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

因此,我们可以总结任何类的要求,以获得格式正确的隐式定义构造函数:

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