[英]Error in simple C++ inheritance
我懂了
错误:没有匹配的函数可以调用'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
对象没有意义怎么办?
PS例如,在相似的Java代码中没有相同的错误,因为我必须添加
super("")
作为Derived
构造函数的主体的第一条陈述。 那真的很合理。
为什么C ++编译器强烈要求不带参数的Base()构造函数?
因为Derived(char*)
尝试调用Base()
,因为您不告诉它调用任何其他构造函数,因此可以这样执行:
Derived(char *c) : Base('x') {}
或者,使用Derived
构造函数参数指向的char
,并确保不要取消引用空指针:
Derived(char *c) : Base( c ? *c : 'x') {}
C ++不需要在基类中使用默认构造函数-但是像在Java中一样,您需要调用Super的等效构造函数,否则编译器将尝试调用默认构造函数(您没有此默认构造函数,因此会出现错误) :
Derived(char *c) : Base(*c) { }
后位:
被称为初始化列表 ,并且是最有用的-不仅可以调用基类的构造函数在那里,但你可以初始化成员变量( : var(val), var2(val2)
具有非语法) -默认构造函数。
您必须指定基本初始化程序:
Derived(char * c) : Base('x') { }
这是因为
Derived(char *c){}
隐式调用
Base()
除非您提供要显式调用的构造函数,否则等效于
Derived(char *c) : Base() {}
^^^^^^
并且Base::Base()
不可用,因为您已经实现了自己的构造函数。 否则默认情况下会启用它。 当您明确提供它时,代码将遵从。 但是可能没有做你想做的 。
您的Base
类没有没有参数的构造函数。 您可以制作一个,也可以为现有的添加initalizer:
Derived(char *c) : Base('a') { ... }
明确为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
为什么C ++编译器强烈要求不带参数的Base()构造函数?
没有。 它要求派生类使用其构造函数之一。 如果他们不提供任何参数,则它将尝试使用默认构造函数。
如果创建没有参数的基础对象没有意义怎么办?
然后,派生类将必须为其使用的构造函数提供参数:
Derived(char *c) : Base(c) {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.