2012-01-16 268 views
-1

當超類中的構造函數接收參數時,它不再是默認的構造函數,對吧?例如C++,默認構造函數

class a { 
    public: 
     int a; 
     int b; 
     a(int c, int d){ 
     cout<<"hello"; 
     }; 
} 

現在,當我嘗試做一個子類,程序導致錯誤,它說:「沒有默認構造函數是在超類中定義的」。我怎麼解決這個問題?我知道,如果我刪除了參數,一切都會好的,但我被告知不要在我的C++測試中這樣做。請幫我弄明白。

+0

這是有關:http://stackoverflow.com/questions/5577663/about-base-class-in-derived-class -initialization – 2012-01-16 15:43:10

回答

2

通常你處理這與初始化列表:

#include <iostream> 

class a { 
public: 
    a(int c, int d) { std::cout << c << " " << d << "\n"; } 
}; 

class b : public a { 
public: 
    b() : a(1, 2) {} 
}; 

int main() { 
    b x; 
    return 0; 
} 
+0

我不允許修改編碼,我只是爲該超類添加了一些額外的子類。 – 2012-01-16 15:50:57

+0

這不涉及修改基類,只涉及派生類(es)。爲了完整性,我已經包含了一個基類定義,但是(例如)這裏給出的'b'應該與您在問題中定義的'a'一起工作。 – 2012-01-16 15:53:10

+0

我試過了,但visual studio強調整行b():a(1,2){}, – 2012-01-16 15:56:21

2

你必須提供一個不需要參數的構造函數。

a::a() 
{ 

} 

一旦你爲你的類提供任何構造函數,編譯器不產生隱含的默認構造函數不帶任何參數。所以如果你的代碼需要一個沒有參數的構造函數,你將不得不自己提供它。

+0

我剛剛嘗試過,但它給了我同樣的錯誤+ a :: a(){}中的一個新錯誤。任何想法? – 2012-01-16 15:49:09

+0

請將您的代碼張貼在Question.Unless中顯示您所嘗試的內容如何獲得幫助? – 2012-01-16 15:50:40

+0

我給了一個代碼,我不允許修改它。我要求做的是添加兩個基於給定的超類的子類,類是這樣的:class a { public: \t int x; \t string h; \t a(int y,string d){ \t \t y = 10; \t d =「hello」; \t cout << y << endl << d; \t}; }; – 2012-01-16 15:52:44

3

如果你的基類不是默認 - 構造的,或者如果你不希望使用基類的默認構造函數,然後你只需要告訴派生類中如何構建基子:

struct b : a 
{ 
    b(int n) : a(n, 2*n) { } 
    //   ^^^^^^^^^ <-- base class initializer, calls desired constructor 
};