作者james732 (好人超)
站內C_and_CPP
標題Re: [問題] 多型的需要???
時間Fri Oct 16 12:49:32 2009
※ 引述《conan77420 (小馬非馬)》之銘言:
: 謝謝各位簡單明瞭的例子解說
: 因為我還沒實際寫過多型所以觀念還不是很正確
: 我想問,在這個例子中,
: "保養清洗()" 中的實作內容是屬於〝樂器〞中的menber function嗎?
: 我記得virtual function 是實作多型的方法,不同的物件做相同的動作
^^^^^^^^^^^^^^^^^^^^^^
其實不該這麼說
以樂器的例子來說,每種樂器都要保養清洗 (都有這個函式)
但是他們的保養清洗方式不一樣 (函式的內容不一樣)
class 樂器 {
public:
virtual void 吹奏() = 0;
virtual void 保養清洗() = 0;
};
class 喇叭 : public 樂器 {
public:
virtual void 吹奏() { cout << "吹喇叭" << endl; }
virtual void 保養清洗() { cout << "洗喇叭" << endl; }
};
class 長號 : public 樂器 {
public:
virtual void 吹奏() { cout << "吹長號" << endl; }
virtual void 保養清洗() { cout << "洗長號" << endl; }
};
int main()
{
樂器 *借來的樂器 = 借一個樂器();
借來的樂器->吹奏();
借來的樂器->保養清洗();
}
這樣不管借到了什麼樂器,都能夠以它的方式來吹奏與保養清洗
只要它是樂器的一種(也就是繼承自樂器類別),並且實作了那兩個函式
如果沒有繼承與多型,可能要這麼麻煩:
int main()
{
樂器 *借來的樂器 = 借一個樂器();
switch (借來的樂器->Type())
{
case 喇叭:
吹喇叭(借來的樂器);
保養清洗喇叭(借來的樂器);
case 長號:
吹長號(借來的樂器);
保養清洗長號(借來的樂器);
// 如果借來的樂器可能有一百種,那這裡就要寫一百個 case
// 為每一種樂器呼叫相對應的函式
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
※ 編輯: james732 來自: 140.117.171.46 (10/16 12:53)
※ 編輯: james732 來自: 140.117.171.46 (10/16 12:55)
推 VictorTom:看完這個例子, 為什麼突然有些很糟糕的念頭勒....XD 10/16 12:56
→ james732:這只是很單純的學術研究與樂器演奏 (認真貌) 10/16 12:57
推 ledia:同一樓, 看前一篇還沒覺得這麼糟糕 XD 10/16 14:33
推 archon:衍生類別裡的清洗函數,要加 virtual 關鍵字的嗎 (?) 10/16 22:20
推 KanoLoa:我記得父類別宣告一次就可以,但是為了不忘記,就都加吧? 10/16 23:49
→ oist77:針對"介面"而寫程式。實務上,比較困難的是如何抽取這些 10/17 00:28
→ oist77:介面。通常都需要有人帶跟指導會比較容易有概念。 10/17 00:29
推 conan77420:完完全全明白了,整個刺重問題點,謝謝James大! 10/17 14:21