C 學習筆記 多型

2021-10-04 17:52:17 字數 2080 閱讀 8347

多型是c++物件導向三大特性之一

多型分為兩類:

靜態多型:函式過載和運算子過載屬於靜態多型,復用函式名

動態多型:派生類和虛函式實現執行時多型

靜態多型和動態多型區別

靜態多型的函式位址早繫結-編譯階段確定函式位址

動態多型的函式位址晚繫結-執行階段確定函式位址

動態多型滿足條件

1、有繼承關係

2、子類重寫父類的虛函式

#include

#include

using

namespace std;

class

animal};

class

cat:

public animal};

//動態多型呼叫

//父類的指標或引用 指向子類物件

void

dospeak

(animal &animal)

//animal &animal = cat;

void

test01()

intmain()

在上面程式執行說話的函式,

如果位址早繫結,在編譯階段確定函式位址,會讓動物說話;

如果想讓貓說話,那麼這個函式位址就不能提前繫結,需要在執行階段進行繫結,即位址晚繫結

純虛函式和抽象類

在多型中,通常父類中虛函式的實現是毫無意義的,主要是呼叫子類重寫的內容

因此可以將 虛函式 改為 純虛函式

純虛函式語法:virtual 返回值型別 函式名 (引數列表) = 0;

當類中有了純虛函式,這個類也稱為抽象類

抽象類特點:

無法例項化物件

子類必須重寫抽象類中的純虛函式,否則也屬於抽象類

#include

#include

using

namespace std;

class

base

;class

son:

public base};

void

test01()

intmain()

多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構**

解決方式:將父類中的析構函式改為 虛析構 或 純虛析構

虛析構和純虛析構共性

可以解決父類指標釋放子類物件

都需要有具體的函式實現

虛析構和純虛析構區別

如果是純虛析構,該類屬於抽象類,無法例項化物件

如果子類中沒有堆區資料,可以不寫為虛析構或純虛析構

虛析構語法:virtual ~類名(){}

純虛析構語法:virtual ~類名()=0;

類名::~;類名(){}

#include

#include

using

namespace std;

class

animal

virtual

void

speak()

=0;//virtual ~animal()

////有了純虛析構後,這個類也屬於抽象類,無法例項化物件

virtual

~animal()

=0;//純虛析構 需要有**實現};

animal::

~animal()

class

cat:

public animal

virtual

void

speak()

~cat()

} string *m_name;};

void

test01()

intmain()

C 學習筆記 多型

引言 1.虛繼承 如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。解決方案 虛繼承宣告,加乙個virtual 關鍵字 2.物件導向新需求 編譯器的做法不是我們期望的 如果用父類指標指向子類物件,再呼叫print 方法,均會呼叫父類中的p...

C 多型學習筆記

看了一堆介紹多型的東西,腦子裡就記得幾個概念了。靜態多型,又叫早繫結,動態多型,應該是叫晚繫結。多型的價值在於使程式更簡潔 更高效。no virtual no 多型,virtual means 已多型。不要覺得問題 很沒用 你還就是說不出來。同樣的命令,不同的物件,做出不同的動作。這就得借助the ...

c 學習筆記 多型

這裡用乙個shape類 rectangle類 cirle類進行說明 virtual shape 虛析構函式 在動態申請空間時候 防止沒析構派生類 virtual double area 虛函式有藏的效果 virtual double zhouchang private double area dou...