什麼是多型?

2021-09-11 00:28:04 字數 1452 閱讀 9697

多型是在不同繼承關係的類物件,去呼叫同一函式,產生了不同的行為。

在繼承體系中,構成多型還必須滿足兩個條件

呼叫函式的物件必須是基類的指標或者引用;多型是:不需要知道物件的實際型別,也能夠呼叫正確的功能。而如果直接操作物件,它的型別就已經被編譯器知道了,看似多型,實則不是。

被呼叫的函式必須是虛函式,且完成了虛函式的重寫。子類物件呼叫這些函式時就會呼叫子類的函式。

函式前面用virtual修飾的就是虛函式,虛函式的意義就是實現多型,如果沒有重寫,虛函式就沒有意義。virtual void func()

重寫的必須是虛函式,

c++11提供override 和 final 來修飾虛函式

final 修飾基類的虛函式不能被派生類重寫 。void* func() final

override 修飾派生類虛函式強制完成重寫,如果沒有重寫會編譯報錯。void func() override

普通函式的繼承是一種實現繼承,派生類繼承了基類函式,可以使用函式,繼承的是函式的實現。

虛函式的繼承是一種介面繼承,派生類繼承的是基類虛函式的介面,目的是為了重寫,達成多型,繼承的是介面。所 以如果不實現多型,不要把函式定義成虛函式

虛函式表

乙個含有虛函式的類中都至少都有乙個虛函式表指標,因為虛函式的位址要被放到虛函式表中, 虛函式表也簡稱虛表。虛表在編譯時出現的,建構函式對其進行初始化。

基類物件的虛函式表和派生類物件的虛函式表示不一樣的,假設基類中有兩個虛函式func1,和func2,派生類重寫了基類中的func1,派生類的虛表中存的是重寫的派生類::func1和基類::func2,所以虛函式的重寫也叫作覆蓋,覆蓋就是指虛表中虛函式的覆蓋。重寫是語法的叫法,覆蓋是原理層的叫法。 

虛函式表本質是乙個存虛函式指標的指標陣列,這個陣列最後麵放了乙個nullptr。 

總結一下派生類的虛表生成:a.先將基類中的虛表內容拷貝乙份到派生類虛表中 b.如果派生類重寫了基 類中某個虛函式,用派生類自己的虛函式覆蓋虛表中基類的虛函式 c.派生類自己新增加的虛函式按其在 派生類中的宣告次序增加到派生類虛表的最後,這裡是編譯器的監視視窗故意隱藏了派生類自己新增的虛函式, 也可以認為是他的乙個小bug。。

虛函式存在**段,虛函式表也在**段。

純虛函式的作用:乙個類中含有純虛函式就是抽象類,抽象類不能例項化出物件,繼承這個抽象類的子類,必須重寫這個虛函式,才能例項化出物件

虛函式後面加 =0 就成了純虛函式,有純虛函式的類叫做抽象類,抽象類又叫做介面類,抽象類是無法例項化出物件的。派生類繼承後只有重寫了純虛函式才能例項化出物件。純虛函式規範了派生類必須重寫,抽象類更好的體現了介面繼承。

所謂多繼承就是乙個子類有兩個或多個直接父類。多繼承中會有多個虛函式表,幾重繼承就會有幾個虛函式表。這些虛函式表會按照派生的順序依次排列。如果子類改寫了父類的虛函式,那麼就會用子類自己的虛函式覆蓋相應的父類虛函式;如果子類有新的虛函式,那麼就新增到第乙個虛函式表的末尾。

什麼是多型?

多型是同乙個行為具有多個不同表現形式或形態的能力。abstract class shapes public abstract void draw public void show class circle extends shapes class square extends shapes publ...

什麼是多型?

1.多型的概念 同乙個事物在不同場景下表現出不同的狀態 2.多型的實現條件 前提在繼承的體系下 1.基類中必須要包含虛函式 被virtual關鍵字修飾的類成員函式成為虛函式 派生類中必須要對基類中的虛函式進行重寫 2.虛函式的呼叫 必須通過基類的指標或引用呼叫虛函式 在程式執行時,來確定函式的行為 ...

什麼是多型?

定義 多型 指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。傳送訊息就是函式呼叫 就是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即乙個引用變數倒底會指向哪個類的例項物件,該引用變...