简单C++继承中的错误

Jay*_*man 1 c++ inheritance

我明白了

错误:没有用于调用'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构造函数体的第一个陈述.这是非常合理的.

jua*_*nza 5

为什么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)


Cam*_*ron 5

C++不需要基类中的默认构造函数 - 但是在Java中,您需要调用等效的Super,否则编译器将尝试调用默认构造函数(您没有,因此错误) :

Derived(char *c) : Base(*c) { }
Run Code Online (Sandbox Code Playgroud)

之后的位:称为初始化列表,并且最有用 - 不仅可以在那里调用基类构造函数,而且可以初始化: var(val), var2(val2)具有非默认构造函数的成员变量(语法).