Re: [問題] 一個物件以及指標的問題。

看板C_and_CPP作者 (好人超)時間15年前 (2010/11/04 01:00), 編輯推噓5(508)
留言13則, 6人參與, 最新討論串3/3 (看更多)
看原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)

11/04 01:04, , 1F
閣下見解精闢,請受小弟拜伏.
11/04 01:04, 1F

11/04 01:04, , 2F
樓上這麼說會讓我很緊張是不是哪裡說錯了...XD
11/04 01:04, 2F

11/04 01:04, , 3F
所以加上virtual就變成dynamic binding
11/04 01:04, 3F

11/04 01:05, , 4F
如果沒加就是compiler binding這樣,應該沒錯了吧T_T
11/04 01:05, 4F

11/04 01:05, , 5F
把指標跟物件搞混的好像不少?
11/04 01:05, 5F

11/04 01:05, , 6F
而且binding這個詞指的對象是function
11/04 01:05, 6F

11/04 01:07, , 7F
不過child的foo不用再多加virtual
11/04 01:07, 7F
不過我會比較喜歡加上去,感覺會比較明確 XD

11/04 01:07, , 8F
vtable 看一遍就會知道原理在哪, 但是看之前基本知識
11/04 01:07, 8F

11/04 01:07, , 9F
需要還不少
11/04 01:07, 9F
真的,我以前也不知道這是三小.... ※ 編輯: james732 來自: 140.117.171.46 (11/04 01:08)

11/04 01:08, , 10F
最好還是加, 這樣再下一層的子類別實作者才會比較知道
11/04 01:08, 10F

11/04 01:09, , 11F
繼承所要負的責任為何
11/04 01:09, 11F

11/04 01:09, , 12F
大致瞭解了,我會再去翻書看看,謝謝各位踴躍的指教!
11/04 01:09, 12F

11/04 02:40, , 13F
推~ 只是非vir method, downcast再call foo不會crash嗎?
11/04 02:40, 13F
文章代碼(AID): #1CqPKOhr (C_and_CPP)
文章代碼(AID): #1CqPKOhr (C_and_CPP)