1

我明白了

错误:没有用于调用“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构造函数主体的第一条语句。这真的很合理。

4

7 回答 7

5

为什么 C++ 编译器强烈要求没有参数的 Base() 构造函数?

因为Derived(char*)尝试调用Base(),因为您没有告诉它调用任何其他构造函数,您可以这样做:

 Derived(char *c) : Base('x') {}

或者,使用构造函数参数char指向Derived的指针,并确保不取消引用空指针:

 Derived(char *c) : Base( c ? *c : 'x') {}
于 2013-05-10T16:44:03.443 回答
5

C++ 不需要基类中的默认构造函数——但与 Java 一样,您需要调用 Super 的等价物,否则编译器将尝试调用默认构造函数(您没有默认构造函数,因此会出现错误) :

Derived(char *c) : Base(*c) { }

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

于 2013-05-10T16:44:52.860 回答
3

您必须指定基本初始化程序:

Derived(char * c)  :  Base('x') { }
于 2013-05-10T16:44:14.163 回答
2

这是因为

Derived(char *c){}

隐式调用

Base()

除非您提供要显式调用的构造函数它等效于

Derived(char *c) : Base() {}
                   ^^^^^^

并且Base::Base()不可用,因为您已经实现了自己的构造函数。否则它会默认启用。当您明确提供它时,代码符合要求。但可能没有做你想做的事。

于 2013-05-10T16:44:01.473 回答
1

您的类Base没有不带参数的构造函数。您可以制作一个,也可以为现有的添加一个初始化器:

 Derived(char *c) : Base('a') { ... } 
于 2013-05-10T16:44:29.340 回答
1

一旦你明确地为 Base 创建了一个构造函数,编译器就不再为你的 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
于 2013-05-10T16:44:38.087 回答
1

为什么 C++ 编译器强烈要求没有参数的 Base() 构造函数?

它没有。它要求派生类使用其构造函数之一;如果它们不提供任何参数,那么它将尝试使用默认构造函数。

如果创建不带参数的 Base 对象没有意义怎么办?

然后派生类必须为其使用的构造函数提供参数:

Derived(char *c) : Base(c) {}
于 2013-05-10T16:48:26.823 回答