我得到了
错误:没有匹配函数来调用'Base :: Base()'
代码
class Base {
private:
char *field;
public:
Base(char *c){
field = c;
}
};
class Derived : public Base {
public:
Derived(char *c){}
};
添加
后,错误消失Base() {}
构造。为什么C ++编译器严格要求没有参数的Base()
构造函数?如果创建一个没有参数的Base
对象没有意义呢?
P.S。例如,我在类似的Java代码中没有相同的错误,因为我必须添加
super("")
作为Derived
构造函数体的第一个语句。这是非常合理的。
答案 0 :(得分:5)
为什么C ++编译器强烈要求没有参数的Base()构造函数?
因为Derived(char*)
试图调用Base()
,因为你没有告诉它调用任何其他构造函数,你可以这样做:
Derived(char *c) : Base('x') {}
或者,使用char
构造函数参数指向的Derived
,并确保不要取消引用空指针:
Derived(char *c) : Base( c ? *c : 'x') {}
答案 1 :(得分:5)
C ++不需要基类中的默认构造函数 - 但是在Java中,您需要调用等效的Super,否则编译器将尝试调用默认构造函数(您没有),因此错误):
Derived(char *c) : Base(*c) { }
:
之后的位被称为初始化列表,并且最有用 - 不仅可以在那里调用基类构造函数,而且可以初始化成员变量({ {1}}语法)具有非默认构造函数。
答案 2 :(得分:3)
您必须指定基本初始值设定项:
Derived(char * c) : Base('x') { }
答案 3 :(得分:2)
Thsi是因为
Derived(char *c){}
隐式调用
Base()
除非你提供明确调用的构造函数它等同于
Derived(char *c) : Base() {}
^^^^^^
由于您已经实现了自己的构造函数,因此Base::Base()
不可用。否则它将默认启用。当您明确提供它时,代码符合。 但不能做你想做的事。
答案 4 :(得分:1)
您的班级Base
没有不带参数的构造函数。你可以制作一个,或为现有的添加一个初始化器:
Derived(char *c) : Base('a') { ... }
答案 5 :(得分:1)
只要您明确地为Base创建构造函数,编译器就不再为您生成默认的ctor。这就是您收到该错误消息的原因。例如
class Base{}; //here compiler auto-generates 'Base(){}' for you
class Base2{
Base2(char c){}
}; //here compiler does NOT auto-generate `Base2(){}` for you.
//Hence that constructor does not exist and you have to create it yourself
答案 6 :(得分:1)
为什么C ++编译器强烈要求没有参数的Base()构造函数?
没有。它要求派生类使用其构造函数之一;如果他们不提供任何参数,那么它将尝试使用默认构造函数。
如果创建没有参数的Base对象会有什么意义呢?
然后派生类必须为它使用的构造函数提供参数:
Derived(char *c) : Base(c) {}