2013-05-10 67 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) {}