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...