早繫結和晚繫結

2021-08-19 16:14:41 字數 630 閱讀 7910

虛函式和一般函式(早繫結與晚繫結)

說早繫結和晚繫結的時候,先來看看繫結的意思吧。

繫結的英文名為binding:把函式體和函式呼叫相聯絡稱為繫結。

類中的一般的函式都是早繫結,也就是說:在呼叫的地方,就已經把要呼叫的函式確定好了,呼叫的類就是定義它的類。現在的「向上對映」就會導致早繫結的問題:

**:#include

using namespace std;

class a

void print()

void print();

void main()

上面就是早繫結的例子,得到的輸出也是:a-father,原理和簡單,首先i.print()的時候,就與型別為a的printf()函式繫結了,所以自然呼叫的是a中的函式啦。現在我們來說下晚繫結:

我們現在在a中的printf()前面加上vitrual,這樣就變成了虛函式啦,也就是晚繫結啦,來卡看它的實現:

同樣,i.print()的時候去找a中的函式,但是發現函式是虛擬的,所以去其指向的物件中找vtpr指標,然後找vptr中找其函式(原理見think in c++中的14章,多型與虛函式),然後這樣實現晚繫結。

在實驗中:發現了類中的函式位址是沒有的,以及一般的函式位址就是函式名,但是要強制型別轉換。

早繫結的問題與動態繫結

物件可以作為自己的類或者作為它的基類 父類 的物件來使用。還能通過基類的位址來操作它。取乙個物件的位址 指標或引用 並將其作為基類的位址來處理,稱為向上型別轉換。也就是說,父類引用或指標可以指向子類物件,通過父類指標或引用操作子類物件。class human class dog public hum...

靜態繫結和動態繫結

c 中,非虛函式都是靜態繫結,而虛函式卻是動態繫結。為了能夠更清楚地了解靜態繫結與動態繫結,我們可以看下面這個例子 include using namespace std class b 那麼兩次呼叫fun 函式是否相同呢?當然,如果d中沒有定義fun 函式 如例子中 那麼兩次呼叫的行為肯定會是一樣...

靜態繫結和動態繫結

物件的靜態型別 物件在宣告是採用的型別,在編譯期確定 物件的動態型別 當前物件所指的型別,在執行期決定,物件的動態型別可以更改,但靜態型別無法更改。靜態繫結 繫結的是物件的靜態型別,某特性 比如函式 依賴於物件的靜態型別,發生在編譯期。動態繫結 繫結的是物件的動態型別,某特性 比如函式 依賴於物件的...