Re: [問題] Virtual base class (diamond inherita …

看板C_and_CPP (C/C++)作者 (Alien)時間16年前 (2009/03/13 10:27), 編輯推噓8(807)
留言15則, 10人參與, 最新討論串1/1
※ 引述《easy1 ( )》之銘言: : C++ 新手 : 想問有關 Virtual base class 的問題 : 在所謂的 diamond inheritance 關係中 : 如果這樣 : class Base {}; : class Derived1 : public Base {}; : class Derived2 : public Base {}; : class Multi : public Derived1, public Derived2 {}; : 以下這樣是不允許的 : Base * ptr = new Multi; : 一定要 宣告成virtual : class Base {}; : class Derived1 : virtual public Base {}; : class Derived2 : virtual public Base {}; : class Multi : public Derived1, public Derived2 {}; : 但是為什麼? : 網路上寫的的解釋我不是很能接受 : 說如果不宣告成 virtual base class : 什麼這樣 Multi 會有兩個 Base 的 objects : pointer ptr 不知道要指到哪一個! : 這樣的解釋不知道是不是我誤會 : 但我不是很理解 : 當我 new 一個 Multi 的時候 不是就只有一個object 嗎 概念上是一個沒錯. 但實際上, 每個 child class obj instance 裡面都有 parent class 的部份, 你可以想象 為, 每個 child class object instance 裡面 有一個 instance attribute 是 parent class object instance. 類似這樣: +-------------------+ | Child | | | | +-------+ | | |Parent | | | | | | | +-------+ | | | +-------------------+ 就是靠這樣, child class 才會 繼承了 parent class 的資料 etc. 同理, 在多重繼承的情況下, 包含每 parent class 一個 的 instance attribute 要是 Child 有兩個 parent class (P1, P2) 而 P1, P2 inherited from G, 那麼 Child 裡面的 P1 P2 就會 各自包含一個分開的 G instance. 結果是 G 的資料 etc 會有兩份, 經由 P1 和 P2 會access 到不同的 G. +------------------------+ | Child | | | | +-------+ +-------+ | | | P1 | | P2 | | | | +---+ | | +---+ | | | | | G | | | | G | | | | | +---+ | | +---+ | | | +-------+ +-------+ | +------------------------+ 用 virtual inheritence 就是把兩者的 G 合起來, 令到 Child 裡面只存著一份 G 這樣瞭了嗎? :) alien -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.155.236.82

03/13 11:49, , 1F
推一個!講解精闢。
03/13 11:49, 1F

03/13 14:25, , 2F
推, 還有精美圖片 XD
03/13 14:25, 2F

03/13 15:00, , 3F
推。跟樓上一樣都是「圖文並茂」的姣姣者。XD
03/13 15:00, 3F

03/13 17:49, , 4F
瞭. 不過這樣的結果是因為C++定義的問題?
03/13 17:49, 4F

03/13 17:55, , 5F
那為什麼不每個繼承都給它個 virtual
03/13 17:55, 5F

03/13 17:55, , 6F
class Derived : virtual public Base
03/13 17:55, 6F

03/13 18:46, , 7F
正如為什麼不每個 method 都加 virtual 一樣 :)
03/13 18:46, 7F

03/13 19:44, , 8F
我不知道別人怎樣,但是有的時候我並不想 virtual
03/13 19:44, 8F

03/13 19:45, , 9F
要是規定死了,那我不就完了...
03/13 19:45, 9F

03/13 20:00, , 10F
一切都是彈性... (茶)
03/13 20:00, 10F

03/14 00:06, , 11F
講解的真不錯,很清楚....推
03/14 00:06, 11F

03/14 02:01, , 12F
@yoco315: 可以給一個簡單範例如何不想virtual 給點啟發嗎?
03/14 02:01, 12F

03/14 11:41, , 13F
用了virtual效率會折損...
03/14 11:41, 13F

10/09 12:11, , 14F
朝聖精美圖片與好文
10/09 12:11, 14F

10/09 15:12, , 15F
推用心
10/09 15:12, 15F
文章代碼(AID): #19kSHvJ- (C_and_CPP)
文章代碼(AID): #19kSHvJ- (C_and_CPP)