C 基礎學習(七) 多型

2021-09-17 04:34:08 字數 3707 閱讀 4996

2 多型原理解析

3 抽象類 和 純虛函式

4 虛析構和純虛析構

5 向上型別轉換和向下型別轉換

1.1.1 靜態多型

1.1.2 動態多型

1.2.1 位址早繫結 編譯階段繫結好位址

1.3.1 位址晚繫結

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

#includeusing namespace std;

class animal

};class cat :public animal

};// 呼叫dospeak,speak函式的位址早就繫結好了,早繫結,靜態聯編,編譯階段就確定好了位址

// 如果想呼叫貓的speak,不能提前繫結好函式的位址了,所以需要在執行時候再去確定函式位址

// 動態聯編,寫法dospeak方法改為虛函式,在父類上宣告虛函式,發生了多型

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

void dospeak(animal &animal)

void test()

int main()

輸出:

小貓說話
還是上乙個程式中類animal,這裡是通過vs 2017的開發人員命令提示符,如下:

這裡也是上乙個程式中類cat:

下面對比兩個程式,第一種類cat中,沒有與animal同名的函式,第二個中有乙個同名的函式。分別通過vs 2017的開發人員命令提示符來演示這兩個效果比對:

#includeusing namespace std;

class animal

};class cat :public animal

;// 呼叫dospeak,speak函式的位址早就繫結好了,早繫結,靜態聯編,編譯階段就確定好了位址

// 如果想呼叫貓的speak,不能提前繫結好函式的位址了,所以需要在執行時候再去確定函式位址

// 動態聯編,寫法dospeak方法改為虛函式,在父類上宣告虛函式,發生了多型

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

};// 呼叫dospeak,speak函式的位址早就繫結好了,早繫結,靜態聯編,編譯階段就確定好了位址

// 如果想呼叫貓的speak,不能提前繫結好函式的位址了,所以需要在執行時候再去確定函式位址

// 動態聯編,寫法dospeak方法改為虛函式,在父類上宣告虛函式,發生了多型

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

void dospeak(animal &animal)

void test()

int main()

輸出:

如有乙個類是抽象類,其他類繼承這個抽象類,並且沒有重寫抽象類中的純虛函式,那麼,繼承過來的類也是抽象類

#includeusing namespace std;

class abstractcalcutor

// 純虛函式

// 如果父類中有了 純虛函式 子類繼承父類,就必須要實現 純虛函式

// 如果父類中有了純虛函式,這個父類 就無法例項化物件了

// 這個類有了純虛函式,通常又稱為 抽象類

virtual int getresult() = 0;

void setv1(int v)

void setv2(int v)

int val1;

int val2;

};// 如果父類中有了 純虛函式 子類繼承父類,就必須要實現 純虛函式

class a :public abstractcalcutor

};void test()

int main()

寫法:virtual ~類名() {}

解決問題:通過父類指標指向子類物件釋放時候不乾淨導致的問題

例子:

#includeusing namespace std;

class animal

// 普通析構 是不會呼叫子類的析構的,所以可能會導致釋放不乾淨

// 利用虛析構來解決這個問題

virtual ~animal() };

class cat:public animal

virtual void speak()

char* m_name;

~cat() }

};void test()

int main()

輸出:

小貓在說話

cat的析構呼叫

animal的析構函式

寫法:virtual ~類名() = 0;

類內宣告 類外實現

如果出現了純虛析構函式,這個類也是抽象類,不可以例項化物件

例子:

#includeusing namespace std;

class animal

// 普通析構 是不會呼叫子類的析構的,所以可能會導致釋放不乾淨

// 利用虛析構來解決這個問題

/*virtual ~animal()

*/ // 純虛函式 寫法

// 純虛函式,需要宣告 還需要實現 類內宣告,類外實現

// 如果函式**現了 純虛析構函式,那麼這個類也算抽象類

// 抽象類 不可例項化物件

virtual ~animal() = 0;

};animal::~animal()

class cat:public animal

virtual void speak()

char* m_name;

~cat() }

};void test()

int main()

輸出:

小貓在說話

cat的析構呼叫

animal的純虛析構呼叫

向下型別轉換 不安全

向上型別轉換 安全

示意圖:

c 基礎學習之多型

最近在看一本書 你必須知道的.net 書涵蓋的內容比較多,對於c net平台以往所學的零散東西有了慢慢的總結和新的認識。把一些程式設計客棧基礎的東西記錄於此。先說說多型吧 1.基類繼承式多型 如書中所說,基類繼承式多型的關鍵是繼承體系的設計與實現。書中舉了個簡單的列子 複製 如下 files myf...

小白學習,c 基礎(七)

1.1修飾成員函式 用const修飾的成員函式時,const修飾this指標指向的記憶體區域,成員函式體內不可以修改本類中的任何普通成員變數,當成員變數型別符前用mutable修飾時例外。int myfun void const const修飾的是成員函式 函式內部不能修改普通成員變數 mutabl...

C 基礎學習筆記07 多型

1.1 多型的基本概念 多型分為兩類 靜態多型 函式過載和運算子過載 動態多型 派生類和虛函式實現執行時多型 靜態多型與動態多型的區別 靜態多型的函式位址早繫結 編譯階段確定函式位址 動態多型的函式位址晚繫結 執行階段確定函式位址 class animal class cat public anim...