2012年7月24日 星期二

C++ 多載?多形?


一個喇叭是一個樂器.
所以你可以寫:
class 樂器
{
protected:
  CString 名稱;
public:
  virtual CString Play( );
};
然後讓
class 喇叭 : public 樂器;
class 揚琴 : public 樂器;

因為每一種樂器都有他自己的演奏方式和聲音
(你總不能 "彈" 一支喇叭或 "吹" 一支揚琴吧?)
但 generally 來說,他們都可以被 "演奏",
當你要叫旗下樂團開始演奏時,
你只要用一個很共通的 p樂器->Play( ) 指令便能達成目的。
程式會自動替你叫用屬於該衍生類別的演湊方式,
這種能力就叫多型。
或者你可以先初步將 "多型" 想像成:
用父類別去訂出大家共通的介面,然後在子類別實作各自獨特的功能。

至於多載,那和父類別、子類別一點關係也沒有。
以多載函式為例,
他只是單純擴充既有介面的功能罷了。
舉例而言,
以下二個函式都是負責把參數1和參數2做相加。
bool AddInt( int a, int b );
bool AddFloat( float a, float b );
對 user 來說,
同樣的動作卻要記二個函式的名字,好煩啊!
如果改寫成以下這樣:
bool Add( int a, int b );
跟 bool Add( float a, float b );
那麼 user 不管自己要加的是什麼,只要記得加法就是通通呼叫 Add() 就好。
程式會自動判斷要套用那一個函式來回應 user。
這樣方便的能力就叫做多載。
或者你可以把 "多載" 想像成:利用不同的參數去叫用功能不同但名稱一樣的函式。

最簡單的比較就是,
用 參數 控制函式行為的,就叫 "多載"。
用 類別 控制函式行為的,就叫 "多型"。
當然,更複雜更精確的說法,請自行再參閱相關書籍囉。

沒有留言: