繁体   English   中英

简单C ++继承错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM