以下是我的观察:
编译器不会为其基类定义了构造函数的派生类生成默认构造函数。
// 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>是否存在编译器不会为派生类生成默认构造函数的任何其他情况?
答案 0 :(得分:8)
如果超类没有默认构造函数,编译器将不会生成默认构造函数。换句话说,由于超类构造函数需要一个参数,并且不能指望编译器知道什么是适当的默认值,编译器将无法生成有用的默认构造函数。但是如果你向ClassCBase
添加了一个无参构造函数,那么ClassC
就可以按原样使用。
答案 1 :(得分:5)
如果没有基类的默认构造函数,编译器将不会定义派生类的隐式默认构造函数(不仅仅是“声明”,定义是此处的键)。 (只要提供了默认参数,任何可以不带参数调用的构造函数都是默认构造函数,无论实际签名如何。)
因此,我们可以总结任何类的要求,以获得格式正确的隐式定义构造函数: