[問題] 多形繼承問題

看板C_and_CPP (C/C++)作者 (fakewen)時間12年前 (2014/04/06 11:59), 12年前編輯推噓4(4022)
留言26則, 2人參與, 最新討論串1/1
1. 先來個範例code http://codepad.org/jG9RbZrp 宣告一個父類別A裡包含virtual fun 再宣告兩個子類別B,C 各自也包含此 fun 我不懂的是,用A物件去接B , C 和 A的指標接,為何答案不一樣 我一直以為"A class有+virtual 執行fun就會去看物件的本質[也就是B C]" 2.第二個問題 範例,這我自己打的 main http://codepad.org/hz4VEAGx class http://codepad.org/9Av7FLdG http://codepad.org/GKNWHfBX http://codepad.org/F746IDlf 這裡也是我confuse的地方 2.1 父class的fun沒有+virtual的情況 B,C new出來的物件 用B,C去接 為什麼不會被複寫到阿[我知道有virtual的話一定會,可是沒+的話B,C宣告同一個fun時應該要複寫調阿] 2.2 有+ 全跑出父class的結果,我猜跟1.的原因依樣 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.248.65.90 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1396756774.A.E68.html ※ 編輯: fakewen (111.248.65.90), 04/06/2014 12:01:13

04/06 12:22, , 1F
因為它要把正確的 this 傳進去
04/06 12:22, 1F
可以請你說清楚一點嗎,小弟還是不大了解

04/06 12:24, , 2F
用pointer或reference接才會dynamic, 就是invoke virtual函式
04/06 12:24, 2F

04/06 12:26, , 3F
時會找出實體class的virtual函式.
04/06 12:26, 3F

04/06 12:27, , 4F
若A是物件, 不是pointer或reference, 則沒有dynamic binding
04/06 12:27, 4F

04/06 12:28, , 5F
去接B只會把在B裡屬於A的部份複製給A, A還是A不是B.
04/06 12:28, 5F
感謝,不過為何 1. 用pointer或reference接才會dynamic? 有原因嗎? 2. 我用 3. 若我不用virtual十,ABC都有同一個fun,"為何不會複寫阿?" 4. 我把我PO的第一個範例裡的B C裡的virtual去掉,答案還是依樣啊? ※ 編輯: fakewen (111.248.65.90), 04/06/2014 17:53:34

04/06 18:06, , 6F
this 跟 funtion 是匹配的, 因為函數內部會用到它的資料
04/06 18:06, 6F

04/06 18:06, , 7F
若你只是一個 A 他怎麼能讓你呼叫到 B/C 的虛擬函數呢?
04/06 18:06, 7F
痾這句是呼應個問題啊?

04/06 18:09, , 8F
若是 ptr/ref 那實際上它還是 B/C 它就可以呼叫他們的函數
04/06 18:09, 8F

04/06 18:12, , 9F
至於實際上如何實現 (vptr/vtbl) 應該都要符合這原則
04/06 18:12, 9F
我懂了,有+virtual時 call by value的話,Aobject只是複製Bo,Co的值,但fun還是A的 call by ptr/ref[請問在多型繼承裡這兩個有差嗎?],是指向B C,就會啟動dynamic binding,執行BC的結果

04/06 18:29, , 10F
base class的virtual func在derived class裡若宣告的函式型態
04/06 18:29, 10F

04/06 18:30, , 11F
與base的virtual func一樣的話, 有沒有加virtual都一樣, 沒有
04/06 18:30, 11F
※ 編輯: fakewen (111.248.65.90), 04/06/2014 18:32:03

04/06 18:31, , 12F
加的話, 編譯器會implicit對derived的加上virtual.
04/06 18:31, 12F
新問題!! http://codepad.org/xQGkcyn2 請問compiler幫加virtual的規範是什麼 上例改成只有B有virtual 照你剛解釋的C:public B 所以應該輸出 A B B阿?

04/06 18:33, , 13F
靜態定義變數A, 就必須配置給A在用的記憶體, 所以你若B給A,
04/06 18:33, 13F

04/06 18:34, , 14F
B的記憶體需要更大, 原本A的記憶體一定裝不下, 所以不能dynam
04/06 18:34, 14F
※ 編輯: fakewen (111.248.65.90), 04/06/2014 18:49:12

04/06 18:35, , 15F
ic. 但pointer或是reference就不同了, 本身用到的記憶體不是
04/06 18:35, 15F

04/06 18:36, , 16F
A也不是BC, 而是指向A的pointer, 實際上它指向的是A還是B還是
04/06 18:36, 16F

04/06 18:37, , 17F
C, 對pointer本身的記憶體無關, 所以pointer才能dynamic
04/06 18:37, 17F
已解答推文問題1.

04/06 18:42, , 18F
想像 aObj.vfun() 裡面用到 this->xxx 而它專屬於 b 會怎樣
04/06 18:42, 18F

04/06 18:53, , 19F
用 ptr/ref 沒差別,通常 virtual func 是去取物件維護的
04/06 18:53, 19F

04/06 18:54, , 20F
虛擬函數表格裡面的項目來呼叫,只是編譯器不應該對 aObj
04/06 18:54, 20F

04/06 18:56, , 21F
以 bObj/cObj 的虛擬函數項目來初始化表格,才不會出錯。
04/06 18:56, 21F

04/06 18:57, , 22F
因為這樣 this 跟 func 就無法正確匹配了。
04/06 18:57, 22F
※ 編輯: fakewen (111.248.65.90), 04/06/2014 18:59:52 ※ 編輯: fakewen (111.248.65.90), 04/06/2014 20:34:26 ※ 編輯: fakewen (111.248.65.90), 04/06/2014 20:45:02

04/06 22:18, , 23F
compiler implicit加virtual是指base有virtual的情況, derive
04/06 22:18, 23F

04/06 22:18, , 24F
d class的同型態同名func會implicit被加上virtual. 我推文上
04/06 22:18, 24F

04/06 22:19, , 25F
說很清楚了吧, 沒跟你說是derived有加 base沒加的情況.
04/06 22:19, 25F

04/06 22:23, , 26F
http://codepad.org/xQGkcyn2 輸出A A很正常啊, A沒有virtual
04/06 22:23, 26F
文章代碼(AID): #1JGD4cve (C_and_CPP)
文章代碼(AID): #1JGD4cve (C_and_CPP)