多型是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...