假設我們有一個基類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 */
受保護的ctor在'Country'中,它將國家'char'作爲參數。 – dyp
問題是'Country'是在'England'之前創建的,這就是爲什麼你不能依賴調用某個派生函數的基類構造函數。相反,反轉邏輯,讓派生類完成所有工作(即:國家(char l):letter(l){}'和'England():Country('e'){}')。 – Synxis
這樣我就不得不寫每個構造函數的初始化?英格蘭(國家('e'){...} 英格蘭(國家a):國家('e'){...} 英格蘭(const char * c):國家('e'){ ...} – tuks