2013-09-21 105 views
0

假設我們有一個基類Country,其中國家字母作爲變量。每個派生類應該有它自己的國家信函。我試過,但它顯然是行不通的:C++構造函數的繼承

class Country 
{ 
protected: 
    char letter; 
    virtual void set_letter(){} 
public: 
    Country() 
    { 
     set_letter(); 
    } 
}; 

class England : public Country 
{ 
    void set_letter() 
    { 
     letter = 'e'; 
    } 
}; 

我的想法是,派生類將繼承基類的構造函數將其稱之爲「set_letter()」方法,這將是爲每個類不同。但是現在我知道這是不可能的,因爲構造函數將從基類調用方法而不是派生。

另一種選擇是寫「letter ='e';」在每個構造函數定義體中。但是如果一個類有很多構造函數呢?我必須每次都寫。

我希望你明白我在說什麼。什麼是最好的解決方案?也許這個:

class Country 
{ 
protected: 
    virtual char letter() const = 0; 
    . 
    . 
    . 
}; 

class England : public Country 
{ 
    static const char let = 'e'; 
    char letter() const 
    { 
     return let; 
    } 
    . 
    . 
    . 
}; 

是的,它的工作原理。但是我想知道是否有一種方法可以在不使用「字母」方法的情況下進行。 使用模板

template<char LETTER> 
class Country 
{ 
private: 
    static const char letter = LETTER; 

public: 
    char get_letter() const { return letter; } 
}; 


class England : public Country<'e'> { ... }; 
class Spain : public Country<'s'> { ... }; 
class France : public Country<'f'> { ... }; 
/* etc */ 
+4

受保護的ctor在'Country'中,它將國家'char'作爲參數。 – dyp

+0

問題是'Country'是在'England'之前創建的,這就是爲什麼你不能依賴調用某個派生函數的基類構造函數。相反,反轉邏輯,讓派生類完成所有工作(即:國家(char l):letter(l){}'和'England():Country('e'){}')。 – Synxis

+0

這樣我就不得不寫每個構造函數的初始化?英格蘭(國家('e'){...} 英格蘭(國家a):國家('e'){...} 英格蘭(const char * c):國家('e'){ ...} – tuks

回答

1

你可以嘗試另一種解決辦法不要問)得到方法。使用這種方法,您可能只使用get方法獲取國家/地區代碼。 這爲每個實例節省(少量)內存以及虛擬方法調用的缺點。 另一個變體是將基類中的get方法聲明爲純虛函數 - 因此強制在派生類中實現它,同時禁止基類的實例化。

class Country 
{ 
protected: 
public: 
    Country() {}; 
    // you may alternatively use "virtual char get_letter() = 0;" instead - 
    //  forcing you to implement get_letter() in every derived class, 
    //  while preventing direct use of the base class. 
    virtual char get_letter() 
    { 
     return((char)0); // 0 being code for generic Country instance 
    } 
} 

class England : public Country 
{ 
    char get_letter() 
    { 
     return('e'); 
    } 
}; 
+0

非常有趣的解決方案,謝謝! – tuks

+0

@tuks注意這個解決方案在正式意義上更爲正確:您使用類表示國家,所以該字母在類中鏈接/關聯,而不是類的實例。因此,最好在類聲明中指定字母(通過本例中的模板)而不是通過構造函數(通過對象初始化器(構造函數初始化類範圍的東西)不是我認爲的良好實踐)。 – Manu343726

+0

一個人不得不懷疑一個國家的幾個實例的地緣政治含義...... o) – SirDarius

1

另一種方法是擺脫了一封信件,並得到國家代碼使用(虛擬:爲什麼...感謝