第九章 虛函式與多型

2021-08-21 03:55:40 字數 2641 閱讀 1064

虛函式與多型性

多型性(polymorphism)是指乙個名字,多種語義;或介面相同,多種實現。

過載函式是多型性的一種簡單形式。

虛函式允許函式呼叫與函式體的聯絡在執行時才進行,稱為動態聯編。

虛函式和動態聯編:

冠以關鍵字 virtual 的成員函式稱為虛函式

實現執行時多型的關鍵首先是要說明虛函式,另外,必須用

基類指標呼叫派生類的不同實現版本

基類指標雖然獲取派生類物件位址,卻只能訪問派生類從基類繼承的成員

#include

using namespace std ;

class  base

void who()  

protected:    char x;

} ;class  first_d : public  base

void who()  

protected:    char y;

虛函式和基類指標:

乙個虛函式,在派生類層介面相同的過載函式都保持虛特性

虛函式必須是類的成員函式

不能將友元說明為虛函式,但虛函式可以是另乙個類的友元

析構函式可以是虛函式,但建構函式不能是虛函式

虛函式的過載特性:

在派生類中過載基類的虛函式要求函式名、返回型別、引數個數、

引數型別和順序完全相同

如果僅僅返回型別不同,c++認為是錯誤過載

如果函式原型不同,僅函式名相同,丟失虛特性 

虛析構函式

建構函式不能是虛函式。建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫基類的建構函式

析構函式可以是虛的。虛析構函式用於指引 delete 運算子正確析構動態物件 

說明:

1.派生類應該從它的基類公有派生。?

2.必須首先在基類中定義虛函式。

3.派生類對基類中宣告虛函式重新定義時,關鍵字virtual可以不寫。

4.一般通過基類指標訪問虛函式時才能體現多型性。

5.乙個虛函式無論被繼承多少次,保持其虛函式特性。

6.虛函式必須是其所在類的成員函式,而不能是友元函式,也不能是靜態函式。

7.建構函式、內聯成員函式、靜態成員函式不能是虛函式。

(虛函式不能以內聯的方式進行處理)

8.析構函式可以是虛函式,通常宣告為虛函式。

純虛函式和抽象類:

純虛函式是一種特殊的虛函式,

在許多情況下,在基類中不能對虛函式給出有意義的實現,而把它宣告為純虛函式,它的實現留給該基類的派生類去做。

這就是純虛函式的作用。

純虛函式是乙個在基類中說明的虛函式,在基類中沒有定義, 要求任何派生類都定義自己的版本

純虛函式為各派生類提供乙個公共介面

純虛函式說明形式:

virtual  型別  函式名(參數列)= 0 ;

乙個具有純虛函式的基類稱為抽象類。 

例如class  point ;

class  shape ; // 抽象類

void  move ( point p )

virtual  void  rotate ( int ) = 0 ; // 純虛函式

virtual  void  draw ( ) = 0 ; // 純虛函式

} ;…...

shape  x ; // error,抽象類不能建立物件

shape  *p ; // ok,可以宣告抽象類的指標

shape  f ( ) ; // error, 抽象類不能作為函式返回型別

void  g ( shape ) ; // error, 抽象類不能作為傳值引數型別

shape  & h ( shape &) ; // ok,可以宣告抽象類的引用

簡單圖形類的舉例:

class figure

virtual void show_area() = 0 ;

};class ******** : public figure

{ public :

void show_area()

{ cout<<"******** with high "<#include

using namespace std ;

#include"figure.h"

int main()

{ ******** t ; //派生類物件

square s ;    circle c;

t.set_dim(10.0,5.0) ;

t.show_area();

s.set_dim(10.0,5.0) ;

s.show_area() ;

c.set_dim(9.0) ;

c.show_area() ;

執行後:

******** with high  and base 5 has an area of 25

square with dimenion 10*5 has an area of 50

circle with radiue 9 has an area of 254.34

請按任意鍵繼續

第九章 函式與模組

大家都知道c語言是一種面向過程的語言,它的特點就是對步驟和過程的細節操作。當面臨編寫大型的程式時,量是會很多的。都是細節的話,很不容易抓住重點的,程式可讀性和維護性都很低。為了克服這個缺點,有了模組化的程式設計思想。把能夠實現特定功能的 塊包裝起來,放到函式裡面 需要使用的時候,直接整體呼叫。這樣每...

第九章 Mysql函式

簡介 數學函式 處理數字 字串函式 處理字串 日期和時間函式 處理日期和時間,獲取時間 條件判斷函式 控制條件選擇 系統資訊函式 獲取mysql系統資訊,包括資料庫名稱,當前使用者名稱和資料庫版本 加密函式 對字串加密和解密 其他函式 格式化函式和鎖函式 函式 作用 函式 作用 abs x 絕對值l...

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...