多型(Polymorphism)按字面的意思就是“多種狀態”,在面向物件語言中,介面的多種不同的實作方式即為多型,參考Charlie Calverts對多型的描述——多型性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之后,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作,簡單的說,就是一句話:允許將子型別別的指標賦值給父型別別的指標,其實我看到過一句話:呼叫同名函式卻會因背景關系的不同而有不同的實作,我覺得這樣更加貼切,還加入了多型三要素:(1)相同函式名 (2)依據背景關系 (3)實作卻不同;
多型是c++的特征之一
多型的分類:靜態多型(靜態聯編)、動態多型(動態聯編) 靜態多型(靜態聯編):函式入口地址 是在 編譯階段 確定(運算子多載、函式多載) 動態多型(動態聯編):函式入口地址 是在 運行階段 確定(虛函式)1 class Animal 2 { 3 public: 4 void sleep(void) 5 { 6 cout<<"animal 動物在睡覺"<<endl; 7 } 8 }; 9 10 class Cat:public Animal 11 { 12 public: 13 void sleep(void) 14 { 15 cout<<"Cat 貓在睡覺!! 喵喵"<<endl; 16 } 17 }; 18 void test01() 19 { 20 //用基類(指標或參考) 保存 子類物件(向上轉換) 21 Animal *p = new Cat; 22 p->sleep();//呼叫的是基類的sleep 23 24 Cat cat; 25 Animal &ob = cat; 26 ob.sleep();//呼叫的是基類的sleep 27 }

總結:基類指標、參考 只能訪問 子類物件中 基類部分 資料
3、使用基類指標、參考 訪問 子類物件中的成員方法(虛函式)
使用virtual修飾成員函式 該成員函式就是虛函式,
1 class Animal 2 { 3 public: 4 //虛函式 5 virtual void sleep(void) 6 { 7 cout<<"animal 動物在睡覺"<<endl; 8 } 9 };vfptr虛函式指標 指向的是虛函式表(vftable) vftable表存放的是 vfptr做保存的函式入口地址 注意://如果 Animal沒有涉及到繼承 函式指標變數 就指向自身sleep
1 class Animal 2 { 3 public: 4 //虛函式 本質 是一個函式指標變數 5 virtual void sleep(void) 6 { 7 cout<<"animal 動物在睡覺"<<endl; 8 } 9 }; 10 void test01() 11 { 12 //如果 Animal沒有涉及到繼承 函式指標變數 就指向自身sleep 13 Animal ob; 14 ob.sleep(); 15 }
4、擁有虛函式的類 涉及得到繼承 2-2
1 class Animal 2 { 3 public: 4 //虛函式 本質 是一個函式指標變數 5 virtual void sleep(void) 6 { 7 cout<<"animal 動物在睡覺"<<endl; 8 } 9 }; 10 class Cat:public Animal 11 { 12 public: 13 virtual void sleep(void) 14 { 15 cout<<"貓在睡覺!!喵喵"<<endl; 16 } 17 };
虛函式的定義要遵循以下重要規則:
1.如果虛函式在基類與派生類中出現,僅僅是名字相同,而形式引數不同,或者是回傳型別不同,那么即使加上了virtual關鍵字,也是不會進行滯后聯編的,
2.只有類的成員函式才能說明為虛函式,因為虛函式僅適合用與有繼承關系的類物件,所以普通函式不能說明為虛函式,
3.靜態成員函式不能是虛函式,因為靜態成員函式的特點是不受限制于某個物件,
4.行內(inline)函式不能是虛函式,因為行內函式不能在運行中動態確定位置,即使虛函式在類的內部定義定義,但是在編譯的時候系統仍然將它看做是非行內的,
5.建構式不能是虛函式,因為構造的時候,物件還是一片位定型的空間,只有構造完成后,物件才是具體類的實體,
6.解構式可以是虛函式,而且通常聲名為虛函式,
同時需要了解多型的特性的virtual修飾,不單單對基類和派生類的普通成員 函式有必要,而且對于基類和派生類的解構式同樣重要
在面試中經常會出現這個問題:C++的動態捆綁機制是怎么樣的?
首先,我們看看編譯器如何處理虛函式,當編譯器發現我們的類中有虛函式的時候,編譯器會創建一張虛函式表,把虛函式的函式入口地址放到虛函式表中,并且在類中秘密增加一個指標,這個指標就是vpointer(縮寫vptr),這個指標是指向物件的虛函式表,在多型呼叫的時候,根據vptr指標,找到虛函式表來實作動態系結,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49336.html
標籤:C++
上一篇:大佬求救,關于匯入
下一篇:zookeeper安裝問題
