同乙個方法在派生類和基類中的不同行為稱為多中形態,簡稱多型。換句話來說,就是方法的行為應取決於呼叫該方法的物件。
1. 多型構成的條件:
下面為大家解釋一下什麼是虛函式,以及虛函式的重寫;
簡單來說,就是被virtual關鍵字修飾的類的成員函式;
在虛函式宣告的後邊加上「==0」,表示該虛函式為純虛函式,派生類繼承之後必須重寫;
class base;}
;
派生類在繼承基類虛函式的基礎上,對虛函式做了一定修改而形成的虛函式的過程被稱為重寫。重寫也被稱為覆蓋;
重寫的虛函式和被重寫的虛函式必須滿足:函式名,引數,返回值都相同(有個例外:協變)。
//虛函式的重寫
class base;}
;class derived:public base;}
;
在派生類中重寫的虛函式前可以不用加virtual關鍵字,這樣也是構成重寫的。
class a
;class b:public a
;class base;}
;class derived:public base
};
過載,重寫,重定義的對比:
2. 多型的原理:
要了解多型的原理,就需要了解虛函式表和虛函式表指標;
通過上邊的例子可以得出:繼承自含有虛函式的類的派生類中也有虛函式表;
派生類的虛函式表的生成過程:
a. 先將基類的虛表內容拷貝乙份到派生類的虛表中;
b. 如果派生類重寫了某個繼承下來的虛函式,那麼在派生類會將自己重寫的虛函式覆蓋掉自己虛表中被重寫的虛函式;(虛函式的重寫叫也做覆蓋,覆蓋是原理層的叫法)
c. 派生類自己增加的虛函式按照宣告的次序增加到派生類虛表的後邊;
總結:虛表可以繼承,如果子類的虛函式沒有重寫,那麼,子類虛表中儲存的該函式的位址仍然是父類的虛函式的位址;
派生類的虛表中虛函式位址的排列順序和基類的虛表中虛函式位址排列順序相同。
注意:虛函式表中儲存的是虛函式的指標,不是虛函式;而虛函式表儲存到記憶體中的**區;物件通過虛表指標訪問虛表;
上面的例子證明了乙個含有虛函式的類的物件不僅僅只包括成員變數,還會有乙個叫做_vfptr的指標。而這個指標就是虛函式表指標,也叫做虛表指標;所以這個指標指向的東西就叫做虛函式表;
類中存在虛函式時,每個物件中都有乙個指向虛函式表的指標(_vfptr)。
下面這個例子完美體現了多型;
動態繫結是多型的基礎!
c++的多型性用一句話概括就是:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式;如果物件型別是基類,就呼叫基類的函式。
C 特性之多型
今天學習了一下多型的有關知識。在 c primer 書中,多型特性似乎只在書的後半部分 oo 裡面提到。雖然是物件導向中很重要的乙個概念,但是並未單獨開出乙個章節來介紹。網上找了一些多型的介紹和程式,總結如下 其底層含義是大記憶體 父類 中套著許多小記憶體 子類 父類 class animal 子類...
C 特性之多型性
c 多型性概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。c 多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式,而子類重新定義父類的做法成為覆蓋或者重寫,重寫可以有兩種,直接重寫成員函式和重寫虛函式,只有重寫了虛函式的才能算作體現了c 多型性 ...
C 三大特性之多型
c 的三大特性,封裝,繼承,多型。封裝可以使得 模組化,繼承可以擴充套件已存在的 而多型的目的則是為了介面重用。本篇部落格主要介紹c 中多型的相關概念及使用方法。多型性是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡...