c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)
生活随笔
收集整理的這篇文章主要介紹了
c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多態的基本概念
靜態聯編和動態聯編
多態分類
靜態聯編
動態聯編
多態
注意事項:
多態原理解析?
?
Animal類里的內部結構?
?
Cat類里的內部結構
虛函數重寫的兩個例外:
1. 協變(基類與派生類虛函數返回值類型不同) 派生類重寫基類虛函數時,與基類虛函數返回值類型不同。即基類虛函數返回基類對象的指針或者引 用,派生類虛函數返回派生類對象的指針或者引用時,稱為協變。
2. 析構函數的重寫(基類與派生類析構函數的名字不同) 如果基類的析構函數為虛函數,此時派生類析構函數只要定義,無論是否加virtual關鍵字,都與基類的 析構函數構成重寫,雖然基類與派生類析構函數名字不同。雖然函數名不相同,看起來違背了重寫的規 則,其實不然,這里可以理解為編譯器對析構函數的名稱做了特殊處理,編譯后析構函數的名稱統一處 理成一樣
?
?
#include<iostream>using namespace std;class Animal { public:virtual void speak(){cout << "動物在說話" << endl;} };class Cat : public Animal { public:virtual void speak(){cout << "小貓在說話" << endl;} };//調用doSpeak ,speak函數的地址早就綁定好了,早綁定,靜態聯編,編譯階段就確定好了地址 //參數類型為Aniaml類類型,所以地址綁定為Animal類的地址 //如果想調用貓的speak,不能提前綁定好函數的地址,所以需要在運行時候再去確定函數地址 //動態聯編,寫法Speak放法改為虛函數,再父類上聲明虛函數,發生了多態 void doSpeak(Animal & animal)//Animal & animal = cat {animal.speak(); }//如果發生了繼承的關系,編譯器允許進行類型轉換 void test01() {Cat cat;doSpeak(cat);} void test02() {//cout << sizeof(Animal) << endl;//沒寫virtual時是1個字節//寫了是4//父類指針指向子類對象發生了多態Animal * animal = new Cat;//animal->speak();//*(int *)*(int *)animal函數地址((void(*)()) (*(int *)*(int *)animal))(); } //什么叫多態? //父類的引用或者指針 指向 子類對象int main() {//test01();test02();system("pause");return 0; }重載,重寫,重定義的對比
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++中的继承--3(多继承问题,菱形继
- 下一篇: 数码宝贝新世纪莱恩岛公路怎么建