我刚读过Constructors and initialization of derived classes
我遇到了一个问题。代码如下。
问题是当我评论父默认构造函数时。会有错误。
但是默认构造函数不应该由编译器自动创建?
谢谢你回答我的问题。
#include <iostream>
using namespace std;
class Father{
public:
int food;
Father(){} // father default constructor
Father(int f):food(f){
}
};
class Child: public Father{
public:
int beverage;
Child(int b):beverage(b){
}
};
int main(int argc, const char * argv[])
{
Child c(10);
return 0;
}
答案 0 :(得分:3)
如果至少存在用户定义的构造函数,则不会生成默认构造函数。在你的情况下,你有一个。
答案 1 :(得分:2)
如果声明非默认构造函数,编译器将不会创建默认值。
我建议使用default
关键字作为默认构造函数,这样每个人都可以立即看到它的作用。
答案 2 :(得分:0)
You Child ctr称之为父亲ctr,它必须这样做。它会调用默认值,除非你告诉它不这样做。运行以下代码,然后切换注释了哪个Child ctr,您将看到。
class Father{
public:
int food;
Father(){ cout<<"father::default\n";} // father default constructor
Father(int f):food(f){
}
};
class Child: public Father{
public:
int beverage;
// Child(int b): beverage(b){}
Child(int b): Father(45), beverage(b){ }
};
int main(int argc, const char * argv[])
{
Child c(10);
return 0;
}
因此,如果你想获得默认构造函数的id,你需要在子类ctrs的启动列表中显式调用其中一个。