2010-01-28 89 views
1

可能重複:
C++ pointer multi-inheritance fun.更多C++多重繼承的樂趣

(跟進:C++ pointer multi-inheritance fun

我正在寫一些代碼從一個基本的參考 - 涉及繼承計數指針類;一些錯綜複雜的C++彈出。我如下降低它:

假設我有:

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 = &c; 
A* pa = &c; 

// does pa point to a valid A object? 
// does pb point to a valid B object? 

// does pa == pb ? 

而且,確實:

// pc == (C*) pa ? 
// pc == (C*) pb ? 

謝謝!

這裏,「==」表示點數相同。

+0

答案仍然是「不是necsarrily。」你真的想要達到什麼目標? – 2010-01-28 22:37:44

+0

重複:http://stackoverflow.com/questions/2157104/c-pointer-multi-inheritance-fun – Bill 2010-01-28 22:39:28

+0

不完全重複,在這個問題的類有成員,所以答案是不同的。 – Skizz 2010-01-28 23:07:32

回答

3
  • 沒有
  • 沒有*

但你需要知道C++是如何組織的記憶。一類,CClass,佈局如下:

offset 
0        First base class in list of base classes 
sizeof first base class  Next base class 
sizeof first N-1 base classes Nth base class 
sizeof all base classes  CClass 

OK,這是比這更復雜一點,如果有一個繼承樹,但你應該得到的基本思路。假設一個int是四個字節,則class C的像佈置:

offset 
0    A::x 
4    A::y 
8    B::xx 
12   B::yy 
16   C:z 

但C型的一個目的是上述所有,所以一個指向一個C的指向偏移0。然而,C++允許隱式向下轉換,因此可以將指向C的指針轉換爲指向A的指針或指向B的指針。但是,如果您查看上述內容,則指向B的指針的偏移量爲8而不是0(指向C),並且指向A的指針位於偏移量0處。因此,將指向C的指針轉換爲指向B的指針會將指針值加8。這是因爲B的方法假設'this'指針指向B的第一個成員(B :: xx),但是如果重新解釋爲指向B的指針(即值相同),則指向C的指針將是指針到B實際所在之前的八個字節的地址,以便所有B的方法將在這個實例中使用A的成員。

上傳(最後兩次轉換)是不同的水壺。從一個指向B的指針到一個指向C的指針確實很難,因爲你不知道指向B的指針是指向B的一個實例,還是指向C的一個實例加八。這是RTTI和動態轉換進來的地方。啓用RTTI(運行時類型信息)後,指向B的指針包含額外的信息,這些信息描述了B的真實含義 - 簡單的B或B作爲C的一部分。額外的成本,執行時間和內存使用量。

最後,這確實突出了C風格演員的模糊性。你真的應該使用C++風格類型轉換(static_cast <>等),因爲這闡明瞭轉換應該完成的方式。

*這也可能是肯定的,我想這取決於編譯器,如果RTTI打開或關閉。您需要深入瞭解標準和編譯器實現的細節,以便確定。