我明白了
错误:没有用于调用'Base :: Base()'的匹配函数
在代码中
class Base {
private:
char *field;
public:
Base(char *c){
field = c;
}
};
class Derived : public Base {
public:
Derived(char *c){}
};
Run Code Online (Sandbox Code Playgroud)
添加后,错误消失
Base() {}
Run Code Online (Sandbox Code Playgroud)
构造函数.为什么C++编译器严格要求Base()没有参数的构造函数?如果创建一个Base没有参数的对象没有意义呢?
PS例如,我在类似的Java代码中没有相同的错误,因为我必须添加
super("")
Run Code Online (Sandbox Code Playgroud)
作为Derived构造函数体的第一个陈述.这是非常合理的.
为什么C++编译器强烈要求Base()构造函数不带参数?
因为Derived(char*)尝试调用Base(),因为你没有告诉它调用任何其他构造函数,你可以这样做:
Derived(char *c) : Base('x') {}
Run Code Online (Sandbox Code Playgroud)
或者,使用构造函数参数char指向的Derived,并确保不要取消引用空指针:
Derived(char *c) : Base( c ? *c : 'x') {}
Run Code Online (Sandbox Code Playgroud)
C++不需要基类中的默认构造函数 - 但是在Java中,您需要调用等效的Super,否则编译器将尝试调用默认构造函数(您没有,因此错误) :
Derived(char *c) : Base(*c) { }
Run Code Online (Sandbox Code Playgroud)
之后的位:称为初始化列表,并且最有用 - 不仅可以在那里调用基类构造函数,而且可以初始化: var(val), var2(val2)具有非默认构造函数的成员变量(语法).