2013-05-10 69 views
1

我得到错误在简单的C++继承

error: no matching function for call to '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构造体的第一个语句。这真的很合理。

+4

“?如果不带参数创建的基本对象是没有意义的什么?”那么你的“派生”类是没有意义的。 – 2013-05-10 16:44:42

+0

“*如果创建不带参数的Base对象会有什么意义?*”那么,不要那样做? – 2013-05-10 16:47:24

+2

在发布这个混乱的HTML时,你在想什么?如果你给它一个机会,Stackoverflow处理语法突出显示非常好... – filmor 2013-05-10 16:48:11

回答

5

C++并不需要在基类中的默认构造函数 - 但在Java中,你需要调用超级相当于,否则编译器会尝试调用默认的构造函数(你没有,因此错误):

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

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

+0

Java也不需要默认的构造函数。 – 2013-05-10 17:01:30

+0

@user:对,对我来说模糊的措辞,对不起。我的意思是,在这种情况下,您需要手动调用非默认的基础构造函数,就像在Java中一样。 – Cameron 2013-05-10 22:22:32

2

Thsi是因为

Derived(char *c){} 

隐式调用

Base() 

除非您提供显式调用哪个构造它相当于

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

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

5

Why does C++ compiler strongly require Base() constructor with no arguments?

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

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

,或者使用char指向由Derived构造函数的参数,并确保不会去参考一个空指针:

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

字符常量的好选择:-) – 2013-05-10 16:44:25

3

您必须指定基初始化:

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

字符常量的好选择! – juanchopanza 2013-05-10 16:45:29

1

Base类没有一个构造函数没有参数。您可以让一个没有,或添加initalizer对现有的:只要你明确地创建基地构造

Derived(char *c) : Base('a') { ... } 
1

,编译器不再生成默认构造函数为您基地。这就是你收到错误信息的原因。例如

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 
1

Why does C++ compiler strongly require Base() constructor with no arguments?

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

What if creating Base object with no arguments makes no sense?

然后派生类必须提供它使用的构造函数的参数(S):

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