2010-01-28 108 views
1

可能顯示的文件:
C++ pointer multi-inheritance fun.
more c++ multiple inheritance funC++多繼承

這是從與參考計數指針基類處理和線程樂趣出現的一個問題。

考慮:

class A{int x, y;}; 
class B{int xx, yy;}; 
class C: public A, public B {int z;}; 
C c; 
C* pc = &c; 
B* pb = CtoB(pc); 
A* pa = CtoA(pc); 

assert(pc == AtoC(pa)); 
assert(pc == BtoC(pb)); 

我怎樣寫CtoB和CTOA得到的B &℃的部分?

如何我寫ATOC和BtoC的找回原來的C?

謝謝!

爲何選票關閉?

我以前的兩個問題問什麼是有效的(答案是「否」);這個問題問「什麼是做指針轉換的有效方法」。

+0

您是否真的需要第三個相同主題的問題? http://stackoverflow.com/questions/2158512/more-c-multiple-inheritance-fun和http://stackoverflow.com/questions/2157104/c-pointer-multi-inheritance-fun – Trent 2010-01-28 22:56:29

回答

3

你不需要任何功能,除非你從A點或B多次(不包括虛擬繼承)派生而來,因爲僅C從A和B派生一次,你只需要使用:

A *pbb = pc; 
B *pba = pc; 

AtoC和BtoC只能通過以下方式安全使用:

C *c = dynamic_cast<C*>(a_or_b_pointer); 
+0

那麼pbb和pba不會指向同一個地方嗎?如果是這樣,它怎麼可能是「A」和「B」? – anon 2010-01-28 23:04:44

+0

他們不會指向同一個地方。編譯器完全知道在將C *轉換爲A */B *時將其轉移多少。你可以打印指針/反彙編來驗證。 – rmn 2010-01-28 23:05:51

+0

其實,我在這個問題上給你一個小的挑戰,如果你有興趣:http://cplusplus.co.il/2010/01/20/a-question-of-memory-layout/ – rmn 2010-01-28 23:08:19

1

才能獲取C中的B &的零件,你可以嘗試:

B* pbb = static_cast<B*>(pc); 
A* pba = static_cast<A*>(pc); 

這應該是安全的。

+0

要轉到另一個方向,我必須動態投射嗎? – anon 2010-01-28 23:02:19

+0

我剛剛注意到,這是要求2x只是與不同的標題:) – sinek 2010-01-28 23:03:01

+0

是的,去用另一種方式,你會使用動態演員。 – 2010-01-28 23:05:24