感謝這些優秀的文章:
虛函式與純虛函式
虛函式的實現1
虛函式的實現2
菱形繼承與虛繼承
首先從虛函式開始說起吧.虛函式是實現了多型機制,具體表現為父型別的指標指向其子類的例項.然後通過服淚指標嗲用實際子類中的成員函式.這種技術可以讓父類指標有多種形態.
如果呼叫非虛函式,無論物件是什麼型別,都執行基類型別所定義的函式,非虛函式總是子啊編譯時根據呼叫函式的物件,引用或指標型別而確定.
虛函式必須是基類的非靜態成員函式。虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。
函式只能借助於指標或者引用來達到多型的效果。
是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」 virtualvoid getname() =0
在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決上述問題,將函式定義為純虛函式,則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。
含有純虛函式的淚稱為抽象類
抽象類是一種特殊的類,它是為了抽象和設計的目的為建立的,它處於繼承層次結構的較上層。
抽象類的定義: 稱帶有純虛函式的類為抽象類。
抽象類的作用:抽象類的主要作用是將有關的操作作為結果介面組織在乙個繼承層次結構中,由它來為派生類提供乙個公共的根,派生類將具體實現在其基類中作為介面的操作。所以派生類實際上刻畫了一組子類的操作介面的通用語義,這些語義也傳給子類,子類可以具體實現這些語義,也可以再將這些語義傳給自己的子類。
使用抽象類時注意:抽象類只能作為基類來使用,其純虛函式的實現由派生類給出。如果派生類中沒有重新定義純虛函式,而只是繼承基類的純虛函式,則這個派生類仍然還是乙個抽象類。如果派生類中給出了基類純虛函式的實現,則該派生類就不再是抽象類了,它是乙個可以建立物件的具體的類。抽象類是不能定義物件的.
虛函式可以做到動態繫結,為了實現動態繫結,編譯器是通過乙個**(虛函式表),在執行時間接的呼叫實際上繫結的函式來達到動態繫結,其中這個我剛所說的**其實現就是乙個「虛函式表」。這張表對我們程式來說是透明的。是編譯器為我們的**自動加上去的(更準確的講,並不是為所有的**都新增一張虛函式表,而是只針對那些包括虛函式的**才加上這張表的)。
既然有了這麼一張虛函式表,自然而然我們就會想到,這個虛函式表裡到底是存放一些什麼東西呢?很簡單,即然叫做虛函式表,當然是存放虛函式了,在c++中,該錶每一行的元素應該就是我們**中虛函式位址了,也就是乙個指標。有了這個位址,我們可以呼叫實際**中的虛函式了。
編譯器既然為我們的**加了一張虛函式表,那這張虛函式表怎麼與我們的**關聯起來呢? 要實現動態繫結,我們應該利用這張虛函式表來呼叫虛函式,為了達到目的,編譯器又會為我們的**增加乙個成員變數,這個成員變數就是乙個指向該虛函式表的指標,該成員變數通常被命名為:vptr。
當子類在改寫了父類中的虛函式時,同時子類的vptr成員也會作修改此時,子類的vptr成員指向的虛函式表中的存放的虛函式指標不再是父類的虛函式位址了,而是子類所改寫父類的虛函式位址。理解這一點就很容易想到了:原來多型體現在這裡!
要想真正的搞明白要考慮這麼幾種繼承模式 一般繼承(無虛函式覆蓋),一般繼承(有虛函式覆蓋),多重繼承(無虛函式覆蓋),多重繼承(有虛函式覆蓋)集中情況,我是參考的這篇文章
最後考慮一種稜形繼承的情況,這樣會發生呼叫歧義,但是虛繼承可以解決這個問題.
虛函式 純虛函式
一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...
虛函式 純虛函式
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標引用來訪問基類和派生類中的同名函式。include using namespace std class student student類成員函式的實現 宣告抽象基類shape class shape virtual float...
虛指標,虛函式,虛函式表,純虛函式
虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...