有如下c++**:
1
2
3
4
5
6
7
8
9
struct
a
virtual
void
bar()
a()
};
struct
b:a
void
bar()
};
那麼 1
2
3
a *p=
new
b;
p->foo();
p->bar();
這個題的結果是barfoob_bar
為什麼㖏,我們研究下哈,
首先說明一下,那兩各foo()是非需函式,這是個不好的寫法,他在這裡只是說明動態繫結這個東西;
首先說一下說明是動態繫結:
動態繫結是指在執行期間(非編譯期)判斷所引用物件的實際型別,根據其實際的型別呼叫其相應的方法。
程式執行過程中,把函式(或過程)呼叫與響應呼叫所需要的**相結合的過程稱為動態繫結。
多型實現的具體形式。
現在我們定乙個b* d,這時候d->foo();和p->foo();調動的是同乙個函式嗎?答案很明顯是否定;
這裡雖然函式名一樣,但已經是靜態繫結了,兩個型別分別呼叫自己類內定義的foo()函式。
這時候在看一下p->bar 這裡雖然p是個a型的指標,但是執行**時涉及到乙個動態繫結問題,p的實際型別是個b,所以呼叫b函式的bar()而不是a的;
最後總結一句話,只有虛函式才涉及到動態繫結,其他可以說都是靜態繫結。
注意:a()
這裡,在建構函式或者析構函式裡呼叫虛函式,此時虛函式不具有多型性。
C 筆記(八) C 動態繫結
在c 中,若派生類中有與基類重名的函式,則使用派生類的 這叫函式覆蓋 補充一點 例 include class animal animal public void eat void sleep class dog public animal dog public void eat void slee...
C 動態繫結
c 中動態繫結是將乙個過程呼叫與相應 鏈結起來的行為。是指與給定的過程呼叫相關聯的 只有在執行期才可知的一種繫結,他是多型實現的具體形式。c 中,通過基類的引用或指標呼叫虛函式時,發生動態繫結。引用 或指標 既可以指向基類物件也可以指向派生類物件,這一事實是動態繫結的關鍵。用引用 或指標 呼叫的虛函...
c 動態繫結
c 的函式呼叫預設不使用動態繫結。要觸發動態繫結,必須滿足兩個條件 只有指定為虛函式的成員函式才能進行動態繫結 必須通過基類型別的引用或指標進行函式呼叫 因為每個派生類物件中都擁有基類部分,所以可以使用基類型別的指標或引用來引用派生類物件 示例 include include using names...