多型的目的:介面重用
c++可以通過過載(函式過載或運算子過載)來實現編譯時的多型性。
class
data
: int
m_x;
intm_y;};
// data類成員函式定義
intx,
inty):m_x(x), m_y(y){}
// 建構函式初始對保護成員化
void
data::set_xy(
intx,
inty)
data::get_x(
void
) data::get_y(
void
) data::norm(
void
)// t_data類宣告
class
t_data:
public
data
protected
: int
m_z;};
// t_data類成員函式定義
四、虛函式
1、虛函式定義:
冠以關鍵字 virtual 的成員函式稱為虛函式
2、虛函式與動態聯編:
實現執行時多型的關鍵首先是要說明虛函式,另外,必須用
基類指標呼叫派生類的不同實現版本
3、虛函式和基類指標:
基類指標雖然獲取派生類物件位址,卻只能訪問派生類從基類繼承的成員
例】#include
通過基類只能從訪問從基類繼承的成員!!
*注意事項:
1)、乙個虛函式,在派生類層介面相同的過載函式都保持虛特性
2)、 虛函式必須是類的成員函式
3)、不能將友元說明為虛函式,但虛函式可以是另乙個類的友元
4)、析構函式可以是虛函式,但建構函式不能是虛函式
4、虛函式的過載特性:
1)、在派生類中過載基類的虛函式要求函式名、返回型別、引數個數、引數型別和順序完全相同
2)、如果僅僅返回型別不同,c++認為是錯誤過載
3)、如果函式原型不同,僅函式名相同,丟失虛特性
例】class base
;// 虛函式
void vf2 ( int ) ;
// 過載,引數不同,虛特性丟失
char vf3 ( ) ;
// error,僅返回型別不同
void f ( ) ;
// 非虛函式過載
} ;void g ( )
;5、虛析構函式:
1)、建構函式不能是虛函式。建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫
基類的建構函式
2)、析構函式可以是虛的。虛析構函式用於指引 delete 運算子正確析構動態物件
例】普通析構函式在刪除動態派生類物件的呼叫情況:
6、有關虛構函式的說明:
1)、派生類應該從它的基類公有派生
2)、必須首先在基類中定義虛函式
3)、派生類對基類中宣告虛函式重新定義時,關鍵字virtual可以不寫
4)、一般通過基類指標訪問虛函式時才能體現多型性
5)、乙個虛函式無論被繼承多少次,保持其虛函式特性
6)、虛函式必須是其所在類的成員函式,而不能是友元函式,也不能是靜態函式
7)、建構函式、內聯成員函式、靜態成員函式不能是虛函式
(虛函式不能以內聯的方式進行處理)
8)、析構函式可以是虛函式,通常宣告為虛函式
7、純虛函式和抽象類:
1)、純虛函式是一種特殊的虛函式
2)、在許多情況下,在基類中不能對虛函式給出有意義的實現,而把它宣告為純虛函式,
它的實現留給該基類的派生類去做,純虛函式是乙個在基類中說明的虛函式,在基類中沒有定義,
要求任何派生類都定義自己的版本,純虛函式為各派生類提供乙個公共介面
3)、純虛函式說明形式:
virtual 型別 函式名(參數列)= 0 ;
4)、乙個具有純虛函式的基類稱為抽象類
例1】class figure
virtual void show_area() = 0 ;
};class ******** : public figure
;例2】
感悟:,
而函式過載時函式的首部是不同的(引數個數或型別不同)。
虛函式與多型
前三者為靜態繫結,虛函式為動態繫結 動態繫結 只有通過基類指標或引用呼叫虛函式才能引發動態繫結 虛函式不能被宣告為靜態 include using namespace std class base virtual void fun2 void fun3 class derived public ba...
虛函式與多型
多型性 呼叫同乙個函式名,可以根據需要實現不同的功能。虛函式 可以在程式執行時通過呼叫相同的函式名而實現不同功能的函式稱為虛函式。編譯時的多型性 函式過載 執行時的多型性 虛函式 執行時的多型性是指在程式執行之前,根據函式名和引數無法確定應該呼叫哪乙個函式,必須在程式的執行過程中,根據具體的執 況來...
虛函式與多型
多型性 c 支援兩種多型性 編譯時多型性,執行時多型性 虛函式 派生類可以不顯式地用virtual宣告虛函式,這時系統就會用以下規則來判斷派生類的乙個函式成員是不是虛函式 一般習慣於在派生類的函式中也使用virtual關鍵字,以增加程式的可讀性 該函式是否與基類的虛函式有相同的名稱 引數個數及對應引...