2013-05-09 65 views
0

我想寫一個相對較深的類層次,我的編譯器一直拋出「沒有匹配函數調用[默認構造函數爲低音類]」。這裏的情景:C++初始化列表中的第二個鏤空類

Class A { 
    A(int);//note, no default constructor 
} 

Class B : public A { 
    B(int i, int j) : A(i), someMemberVariable(j) {} 
    int someMemberVariable; 
} 

Class C : public B { 
    C(int k, int l) : B(k, l) {} 
} 

和編譯器會引發錯誤上說:「對於調用A :: A()沒有匹配功能」行了C類的構造函數,並告訴我,使用A ::一(INT)。

我知道我沒有類A的默認構造函數,編譯器在我嘗試子類的子類時感到困惑。但是,我不明白的是爲什麼。我已經使用了一個初始化列表來避免這一點。如果我只使用2級深層類,那麼它工作得很好,但是第三類給了我錯誤。我在這裏做錯了什麼?

+3

你應該準備一個['SSCCE'](http://sscce.org)。很難相信上面的代碼可以代表你的問題,因爲你沒有從任何實際的代碼中複製 - 粘貼這些代碼('Class'不是關鍵字,缺少分號等等) – 2013-05-09 17:46:51

+4

構造函數應該是公開的;並修復後的類,一切編譯VS2008 – Max 2013-05-09 17:49:30

+0

看起來像它在這裏工作正常:https://ideone.com/CxoszY。 「我的編譯器不斷拋出」 - 也許你想分享你正在使用的編譯器? – Bill 2013-05-09 17:54:06

回答

3

隨着人們評價你只是需要讓公衆的構造,然後你的代碼有一些格式問題:

class A 
{ 
    public: 
    A(int a) : blah(a) {}; //note, no default constructor 
    int blah; 
}; 

class B : public A 
{ 
    public: 
    B(int i, int j) : A(i), someMemberVariable(j) {} 
    int someMemberVariable; 
}; 

class C : public B 
{ 
    public: 
    C(int k, int l) : B(k, l) {} 
}; 

int main(void) 
{ 
    C c(5,4); 
    return 0; 
} 

此代碼編譯乾淨,你想要做什麼。