(個人筆記,看不懂莫怪)
一多型 在程式執行的過程中才能決定呼叫什麼方法,宣告基類的指標,利用該指標指向任意乙個子類的物件,呼叫相應的虛函式,可以根據指向的子類的不同而實現不同的方法。
同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。
類中的多型就是派生類對同基類的方法進行了重寫,然後程式根據上下文資訊來決定使用哪個方法。
在基類base 和派生類 first中,如果在first類中對基類的乙個函式input()進行了重寫,
如果出現
first one
base *p = &one;
p->input()
這種情況的時候,那麼指標p指向的函式是基類base的input()函式;
那當我們希望使用的派生類的函式是,我們就在基類的input()函式前加上關鍵字 virtual
如果使用了virtual ,則程式根據引用或者指標指向的物件的型別來選擇方法,否則的話程式會根據引用或者指標的型別來選擇方法。
編譯器會為有虛函式的類維護乙個虛函式表,這個虛函式表是乙個一維陣列,裡面存這每個虛函式的記憶體位址。
同時當物件呼叫建構函式時會自動生成乙個虛表指標,虛表指標指向虛函式表,當呼叫虛函式時有虛表指標找到虛函式的位址然後呼叫。p->vp->input()二
first one
base *p = &one;//將派生類引用或者指標轉換成基類引用或者指標被成為向上強制轉換,這個是允許的。
(這樣就可以使用乙個陣列來表示多種型別的物件了 base *arr[10])
反過來
base one;
first *p = &one.://這是向下強制轉換,如果不適用顯示型別轉換,則這種方式是不允許的。顯示型別轉換:first *p = (base *)&one 三
基類的析構函式要定義城虛函式,否則當使用new/delete來為派生類的物件動態分配空間的時候,當物件被**時,呼叫的就是基類的析構函式了,這顯然會造成記憶體洩露的問題。
四virtual void fun()=0 這個是純虛函式
抽象類:至少有乙個純虛函式,而且派生類必須要實現純虛函式。否則派生類就變成了抽象類了。
抽象類不能建立該類的物件。
posted on
2018-08-15 22:38
...)
編輯收藏
多型,虛函式,純虛函式,抽象類
c 中,實現多型有以下方法 虛函式,抽象類,過載,覆蓋 多型性在object pascal和c 中都是通過虛函式 virtual function 實現的。這麼一大堆名詞,實際上就圍繞一件事展開,就是多型,其他三個名詞都是為實現c 的多型機制而提出的一些規則,下面分兩部分介紹,第一部分介紹 多型 第...
虛函式多型
一 知識點 1 乙個操作隨著所傳遞的物件型別的不同能夠做出不同的反應,其行為模式成為多型。p413 2 基類與派生類的同名操作,只要標記上virtual,則該操作便具有多型性。p416 3 一旦標記基類的函式為虛函式,便有連鎖反應,後面繼承的類中一切同名成員函式都變成了虛函式。如果是引發實際複製動作...
多型 虛函式
繼承模式分為單繼承和多繼承 在多繼承中會有相應的一些問題產生,比如資料冗餘,二義性等問題,那麼我們要如何解決這種問題。利用虛繼承便可以解決,在虛繼承的時候由虛基表可以去除資料冗餘和二義性。那麼函式可不可以寫成是虛函式呢?寫成虛函式有什麼作用?在派生類裡重寫基類的虛函式可以實現多型。include u...