關於虛函式與多型的學習總結

2021-08-21 06:45:05 字數 3239 閱讀 6619

一,基礎知識

1,基本概念

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

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

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

2,虛函式和動態聯編

冠以關鍵字 virtual 的成員函式稱為虛函式, 實現執行時多型的關鍵首先是要說明虛函式,另外,必須用

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

3,虛函式和基類指標

通過基類指標,只能訪問從基類繼承的成員

ps:

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

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

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

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

4,虛函式的過載特性

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

引數型別和順序完全相同, 如果僅僅返回型別不同,c++認為是錯誤過載,如果函式原型不同,僅函式名相同,丟失虛特性 

5, 虛析構函式

建構函式不能是虛函式。建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫基類的建構函式, 析構函式可以是虛的。虛析構函式用於指引delete 運算子正確析構動態物件 

ps:

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

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

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

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

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

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

7>建構函式、內聯成員函式、靜態成員函式不能是虛函式。(虛函式不能以內聯的方式進行處理)

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

6,成員函式呼叫虛函式(採用動態聯編)

7,純虛函式和抽象類

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

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

純虛函式為各派生類提供乙個公共介面,純虛函式說明形式:

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

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

二,簡單應用

1,虛函式和基類指標

#includeusing namespace std ;

class base

void who()

protected: char x;

} ;class first_d : public base

void who()

protected: char y;

} ;class second_d : public first_d

void who()

protected: char z;

} ;int main()

//通過基類指標

//只能訪問從基類繼承的成員

2,虛函式的過載特性
class  base

;class derived : public base

;void g ( )

3,虛析構函式

例 普通析構函式在刪除動態派生類物件的呼叫情況

#includeusing namespace std ;

class a

} ;class b : public a

} ;int main()

4,成員函式呼叫虛函式(採用動態聯編)

#include class a

virtual void show(){}

void show_name()

5,純虛函式與抽象類

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

#includeusing namespace std ;

class number

virtual void show() = 0 ;

protected: int val ;

};class hex_type : public number

void show()

};class dec_type : public number

void show()

};class oct_type : public number

void show()

}; void fun( number & n ) // 抽象類的引用引數

int main()

三,學習感悟

這一塊感覺有點難以理解,虛函式還行,純虛函式就感覺有些麻煩,到了抽象類,就是真的很抽象了。多看了兩遍課件,還是不難理解的。虛函式,避免在父類使用基類的指標時還是指向子類中過載前內容,保證了該資料成員或者成員函式一定被繼承。純虛函式,裡面沒有任何語句,只是充當介面作用,這是就能看出來一點分功能操作的雛形了,這一部分的實際應用不多,但也能明白純虛函式的作用是什麼,函式介面,將功能分塊。小的程式看不出什麼來,大的程式設計,應該就很有必要了。

虛函式與多型學習總結

1.多型性 指乙個名字,多種語義 或介面相同,多種實現。過載函式是多型性的一種簡單形式。虛函式允許函式呼叫與函式體的聯絡在執行時才進行,稱為動態聯編。2.虛函式 冠以關鍵字 virtual 的成員函式稱為虛函式。基類指標 實現執行時多型的關鍵首先是要說明虛函式,另外,必須用呼叫派生類的不同實現版本。...

c 虛函式與多型學習總結

多型性 乙個名字多種語義,或介面相同多種實現。過載函式是多型性的一種簡單形式 動態聯編 虛函式允許函式呼叫與函式體的聯絡 虛函式宣告格式 virtual 成員函式。虛函式必須是類的成員函式。建構函式不能是虛函式但析構函式可以是虛函式。乙個虛函式在派生類中相同的過載函式都保持虛函式的特性。不能將友元函...

繼承 虛函式與多型學習總結

基礎知識點 類之間的關係 繼承 在已有類的基礎上建立新類的過程乙個b 類繼承a 類,或稱從類 a 派生b類 a 稱為基類 父類 類 b 稱為派生類 子類 基類和派生類 類繼承關係的語法形式 class 派生類名 基類名錶 基類名錶 構成訪問控制 基類名1 訪問控制 基類名2,訪問控制 基類名n 訪問...