2013-01-22 26 views
1

我有三個類。基類被稱爲Jet建設者的繼承問題

class Jet 
{ 
public : 
    Jet(int fuel); 
    void fly(); 

protected: 
    int mfuel; 
}; 

Jet::Jet(int fuel): mfuel(fuel) {} 

第二類被稱爲F16

class F16 : public Jet 
{ 
public: 
    F16(int fuel, int numMissiles); 
    void fireMissile(); 

protected: 
    int mNumMissles; 
}; 

F16::F16(int fuel, int numMissiles): Jet(fuel), mNumMissles(numMissiles) {} 

第三類B18通常從F16繼承的一切:

class B18 : public F16 
{ 
public: 
    B18(int fuel, int numMissiles, int bullets); 
    void fireBullets(); 

private: 
    int mBullets; 

}; 

現在我的問題是,是這裏的成員成員初始值設定項有一種方法:

B18::B18(int fuel, int numMissiles, int bullets) : 
     F16(fuel, numMissiles), mBullets(bullets) {} 

...這樣我就可以抹去int fuelB18,只有繼承F16numMissiles?例如:

B18::B18(int numMissiles, int bullets) : 
     F16(numMissiles), mBullets(bullets) {} 

喜歡的東西上面(這當然是不行的,而且很可能有邏輯錯誤)

+4

我不明白「smthg」或「ofc」。你能用完整的詞來代替那些詞嗎? –

+0

我明白這是一個人爲的例子,但從設計的角度來看,'B18'不是'F16'。兩者都應該從'Jet'繼承。也許描述你正在解決的真正問題。 –

+0

Ofc&Ofc&Ofcourse,Smthg&東西 – RedFox

回答

1

您的評論提供了有關該問題的更多信息。所以我在這裏引用的緣故能見度:

,我嘗試了事情如果有隻是一個F16的一部分初始化爲B18像剛纔的numMussiles部分的可能性,而不是燃料也從構造函數...簡而言之,選擇我想要在成員初始化器中繼承的內容

看起來像重載的構造函數可以解決您的問題。將另一個構造函數添加到您的類F16,以便您可以根據您想要初始化的內容在派生類中選擇適當的構造函數。

這裏是你可以做什麼:

class F16 : public Jet 
{ 
public: 
    F16(int numMissiles); //<------ add this 
    F16(int fuel,int numMissiles); 
    void fireMissile(); 

    protected: 
    int mNumMissles; 
}; 

那麼您可以根據您要初始化什麼選擇的構造:

//unchanged : from your code! 
B18::B18(int numMissiles,int bullets): F16(numMissiles),mBullets(bullets) {} 

它從F16選擇第一個構造函數。請注意,最好對類進行完全初始化,這意味着將每個成員初始化爲一些[默認]值(即使您在特定情況下不需要它們)。

2

我懷疑在這種情況下繼承可以完全阻止,但你確實提到了成員初始值設定項的代碼行。在這種情況下,你應該可以這樣做:

B18::B18(int numMissiles,int bullets): F16(30,numMissiles),mBullets(bullets) {} 

雖然你可能已經知道了。另一種辦法是這樣的:

public: 
    F16(int numMissiles, int fuel = 45); 

和:

B18::B18(int numMissiles,int bullets): F16(numMissiles),mBullets(bullets) {} 

我不知道,如果這是你需要什麼,但也許它會幫助你。再次,我可能是錯誤的,但我有點懷疑你可以通過繼承來設置基類的變量。最接近的是將指針變量保留爲未初始化狀態。

+0

我不知道第一個技巧謝謝你。 – RedFox

+0

但是有什麼辦法可以不使用整數? – RedFox

+0

Redfox,你已經將'Jet'定義爲*需要一個整數'fuel'參數。除非您更改'Jet'以使該參數可選,否則所有其他創建'Jet'實例的代碼都必須以某種方式提供值*。您可以將責任傳遞給呼叫者,如同您的原始代碼一樣,或者進行默認選擇,就像此答案中的代碼一樣。 –

0

不完全確定你的意思,因爲你可以繼承不存在的值。但也許你想要做的事情涉及默認參數?因此,例如,你必須:

class Jet 
{ 
public : 
    Jet(int fuel); 
    void fly(); 

protected: 
    int mfuel; 
}; 

Jet::Jet(int fuel): mfuel(fuel) {} 

class F16 : public Jet 
{ 
public: 
    F16(int numMissiles = 10, int fuel = 20); 
    void fireMissile(); 

protected: 
    int mNumMissles; 
}; 

F16::F16(int numMissiles, int fuel): Jet(fuel), mNumMissles(numMissiles) {} 

class B18: public F16 
{ 
public : 
    B18(int bullets, int numMissiles, int fuel); 
    B18(int bullets); 
    void firebullets(); 

private: 
    int mBullets; 
}; 

B18::B18(int bullets, int numMissiles, int fuel) : F16(numMissiles, fuel), mBullets(bullets) {} 
B18::B18(int bullets): F16(), mBullets(bullets) {} 

通過這種方式,創造了單個int參數B18對象將使用其默認參數調用構造函數F16。

+1

歡迎來到Stack Overflow。 「你可以從一個不存在的價值中繼承」是沒有意義的。你能否請你的答案澄清或重述? –

+0

@RobKennedy我鬆散地將其譯爲*「構造函數和方法的參數的缺省值存在,讓我給你看看它們。」*。也許。 :-)但是,歡迎use​​r2001505 - 編輯是這裏樂趣的重要組成部分。它也有助於設置你的用戶名,你也可以[上傳個人頭像](http://blog.stackoverflow.com/2013/01/announcing-a-new-way-to-change-your-profile-圖片/)很容易。 – HostileFork