2013-07-12 134 views
0

我得到2套錯誤,試圖建立時:類繼承錯誤?

(第一版本)

In constructor 'aa::aa(int)': 
no matching function for call to 'bb:bb()' 
candidates are: bb::bb(int) 
bb:bb(const bb&) 

(當時我打再次構建並獲得以下)

file not recognized: File truncated... takes me to assembly 
collect2:ld returned 1 exit status 

#ifndef BB_H 
#define BB_H 

class bb 
{ 
public: 
    bb(int _m); 
    int m; 
}; 

#endif // BB_H 

#ifndef AA_H 
#define AA_H 
#include "AA/bb.h" 

class aa : bb 
{ 

public: 
    aa(int _i); 

    int i; 
    int j; 
}; 

#endif // AA_H 

#include "bb.h" 

bb::bb(int _m) 
{ 
    m = _m * 5; 
} 

#include "aa.h" 

aa::aa(int _i) 
{ 
    i = _i; 
    j = i + 1; 
} 
+2

您需要使用初始化程序列表來初始化基礎。這應該在任何書或繼承教程中解決。 – chris

+0

如果你沒有得到克里斯談論的內容:派生構造函數將調用基類默認構造器'bb:bb()'。既然你沒有指定'bb:bb()',它就不能構造'aa'的對象(它不知道如何構造它的基礎)。但是,您可以指定'aa :: aa(int)'應該使用'bb :: bb(int)':aa:aa(int _i):bb(_i){/ * ... * /}'。細節可以在任何像樣的書中找到。 – Zeta

回答

3
In constructor 'aa::aa(int)': 
no matching function for call to 'bb:bb()' 

編譯器的權利。你沒有默認的構造函數。即使編譯器會爲你寫一個默認的構造函數,如果你沒有編寫它,那麼如果你有用戶定義的構造函數,就不會發生這種情況。

你有兩個選擇:

首先,實現一個默認的構造函數:

class bb 
{ 
public: 
    bb(int _m); 
    bb(); 
    int m; 
}; 

bb:bb() 
{ 
} 

這也許是因爲毛你將如何初始化m

二,請致電aa的構造轉換構造,使用初始化列表:創建一個派生類對象時

aa::aa(int _i) 
: 
    bb (_i) 
{ 
    i = _i; 
    j = i + 1; 
} 
0

基類構造函數被調用。
在你的例子中,你必須創建了一個類aa的對象,因爲bb類是它的基類,編譯器搜索bb類的默認構造函數。當你創建了一個參數化的構造函數時,它不會提供任何導致錯誤的默認構造函數
不匹配函數調用bb()。
爲了克服這種錯誤或者提供一流的BB默認構造函數一樣

bb::bb() 
    { 
    } 



在AA構造函數初始化列表只是給類BB參數構造函數的調用像下面

aa::aa(int i):bb(int x) 
    { 
    } 


我在這裏做的是,在初始化派生類的數據成員之前,我剛剛初始化了基類的數據成員,並且編譯器期望得到相同的結果。