作者james732 (好人超)
看板C_and_CPP
標題Re: [問題] 一個物件以及指標的問題。
時間Thu Nov 4 01:00:05 2010
看原po對於virtual有一點誤會,我就來小小的說一下好了
依我貼的例子來說(
http://nopaste.csie.org/97cb2):
int main()
{
Parent *pp = new
Parent();
pp->foo();
Child *cp = (Child *)pp;
// 其實它是 Parent
cp->foo();
Parent *pc = new
Child();
pc->foo();
Child *cc = (Child *)pc;
// 它真的是 Child
cc->foo();
}
當foo不是virtual的時候,依序會呼叫 Parent, Child, Parent, Child
而foo是virtual的時候,呼叫順序就變成了 Parent, Parent, Child, Child
發現了嗎?沒加virtual的時候,順序與等號的左邊,也就是紅色的部份相符
加上virtual之後,就會跟等號的右邊,也就是綠色的部份相符
因此:
(1) 如果沒有virtual,那個
指標是什麼類別,它就會呼叫該類別的foo
(2) 如果有virtual,那麼該指標
指的是什麼類別的物件,它就會呼叫該類別的foo
也就是說,差別是在於,哪一種指標(編譯期),或者指向什麼東西(執行期)
來判斷該呼叫
哪個類別的函式 <=重點是哪個函式
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
※ 編輯: james732 來自: 140.117.171.46 (11/04 01:03)
※ 編輯: james732 來自: 140.117.171.46 (11/04 01:04)
推 DEATHX:閣下見解精闢,請受小弟拜伏. 11/04 01:04
→ james732:樓上這麼說會讓我很緊張是不是哪裡說錯了...XD 11/04 01:04
推 StephenNash:所以加上virtual就變成dynamic binding 11/04 01:04
→ StephenNash:如果沒加就是compiler binding這樣,應該沒錯了吧T_T 11/04 01:05
推 loveflames:把指標跟物件搞混的好像不少? 11/04 01:05
→ james732:而且binding這個詞指的對象是function 11/04 01:05
→ loveflames:不過child的foo不用再多加virtual 11/04 01:07
不過我會比較喜歡加上去,感覺會比較明確 XD
推 loveme00835:vtable 看一遍就會知道原理在哪, 但是看之前基本知識 11/04 01:07
→ loveme00835:需要還不少 11/04 01:07
真的,我以前也不知道這是三小....
※ 編輯: james732 來自: 140.117.171.46 (11/04 01:08)
→ loveme00835:最好還是加, 這樣再下一層的子類別實作者才會比較知道 11/04 01:08
→ loveme00835:繼承所要負的責任為何 11/04 01:09
→ StephenNash:大致瞭解了,我會再去翻書看看,謝謝各位踴躍的指教! 11/04 01:09
推 softwind:推~ 只是非vir method, downcast再call foo不會crash嗎? 11/04 02:40