看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
allen501pc:推一個!講解精闢。 03/13 11:49
ledia:推, 還有精美圖片 XD 03/13 14:25
saxontai:推。跟樓上一樣都是「圖文並茂」的姣姣者。XD 03/13 15:00
easy1:瞭. 不過這樣的結果是因為C++定義的問題? 03/13 17:49
easy1:那為什麼不每個繼承都給它個 virtual 03/13 17:55
easy1:class Derived : virtual public Base 03/13 17:55
adrianshum:正如為什麼不每個 method 都加 virtual 一樣 :) 03/13 18:46
yoco315:我不知道別人怎樣,但是有的時候我並不想 virtual 03/13 19:44
yoco315:要是規定死了,那我不就完了... 03/13 19:45
saxontai:一切都是彈性... (茶) 03/13 20:00
iwayne:講解的真不錯,很清楚....推 03/14 00:06
easy1:@yoco315: 可以給一個簡單範例如何不想virtual 給點啟發嗎? 03/14 02:01
legnaleurc:用了virtual效率會折損... 03/14 11:41
james732:朝聖精美圖片與好文 10/09 12:11
walm20: 推用心 10/09 15:12