c 之虛函式

2021-10-07 03:24:36 字數 1231 閱讀 6727

靜態聯編也叫做早繫結,函式名與其在記憶體中的可執行**之間的對應關係在編譯時就已經確定了

動態聯編也叫做晚繫結,是之成員函式的呼叫語句在編譯時不知道要執行哪個記憶體位址的**。成員函式的呼叫會根據目標物件的動態型別在程式執行時將函式名繫結到具體的函式上

靜態聯編舉例

class shape

執行上面的**後,並不會返回圓和矩形的面積,命令行內會有兩行caculatearea

這裡我們用基類指標shape去指向了派生類物件,當我們呼叫caculatearea的時候,雖然我們例項化的物件型別是circle和rect,但是因為這是靜態聯編,shape中的caculatearea函式在編譯前就已經確定了

那麼我們如果想實現用基類指標指向的派生類物件,根據不同的物件型別,呼叫相應的函式,就需要動態聯編

虛函式就是用virtual關鍵字修飾的函式

virtual 函式型別 成員函式名(引數列表);

動態聯編的條件

動態聯編舉例

class shape

{public:

virtual double calculatearea(){

cout<

命令行會出現

3.14

2此時說明了s1和s2指標分別呼叫了其對應型別的成員函式,從而實現動態聯編

當成員函式中有虛函式的時候,那麼當我例項化物件的時候,會有乙個虛函式表指標資料成員,他就指向了當前類的虛函式表

虛函式表裡面儲存著函式指標,根據函式指標,可以找到需要執行的**

對於派生類的虛函式成員函式,也有對應的虛函式表,如果我們自己重新定義了calcarea函式,那麼對應函式的指標位址將會改變

呼叫過程是,

動態聯編要求在基類定義虛函式,有時候基類的虛函式我們不知道如何實現,對於這樣一些物理上無法實現,邏輯上又不得不存在的抽象的虛函式,可以用純虛函式來定義

純虛函式定義格式

virtual 函式返回型別 純虛函式名(參數列)=0

補充:介面類

只含有純虛函式的類叫做介面類

介面類一般表明一種能力或者協議或者規範

C 之虛函式

若乙個例項方法宣告前帶有virtual關鍵字,那麼這個方法就是虛方法。虛方法與非虛方法的最大不同是,虛方法的實現可以由派生類所取代,這種取代是通過方法的重寫實現的 以後再講 虛方法的特點 虛方法前不允許有static,abstract,或override修飾符 虛方法不能是私有的,因此不能使用pri...

C 之虛函式

引入原因 為了方便使用多型特性,我們常常需要在基類中定義虛函式。class cman void move private class cchild public cman private cman m man cchild m child cman p 虛函式的使用精髓,如果不定義基類的指標去使用,...

C 之虛函式

虛函式的實質和用途 如果不定義虛函式,基類和擴充套件類中不能有同名函式 名字,引數個數順序型別都相同 否則會發生同名覆蓋,此時想用基類指標去呼叫擴充套件類的物件是行不通的 但如果將基類的成員函式定時成虛函式,相當於允許擴充套件類中重新定義該同名函式執行不同的功能,此時就可以用基類的指標去指向擴充套件...