简单C ++继承中的错误

时间:2013-05-10 16:41:36

标签: 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对象没有意义呢?

P.S。例如,我在类似的Java代码中没有相同的错误,因为我必须添加

super("")

作为Derived构造函数体的第一个语句。这是非常合理的。

7 个答案:

答案 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) {}