作者adrianshum (Alien)
看板C_and_CPP
標題Re: [問題] Virtual base class (diamond inherita …
時間Fri Mar 13 10:27:04 2009
※ 引述《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