看板 C_and_CPP 關於我們 聯絡資訊
看原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