2016-09-19 68 views
0

所以給定簡單的代碼像以下類繼承鏈和指針到每個類別

+----------------+ 
|  C (int) | 
|+--------------+| 
|| B (+1) || 
||+------------+|| 
||| A (2int) ||| 
||+------------+|| 
|+--------------+| 
+----------------+ 

所以現在簡單的代碼:

C objectC; 
A* aPtr = &objectC; 
B* bPtr = &objectC; 
C* cPtr = &objectC; 

我所期望的,即使編譯器生成的代碼,這使得日Ë下面的表達式返回true:

(aPtr == bPtr && bPtr == cPtr) 

下面的表達式應該返回false:

((int)aPtr == (int)bPtr && (int)bPtr == (int)cPtr) 

,但我的電腦上它也返回真。在打印出指針的數值之後,它們也是相同的。

我的問題是爲什麼運行程序後預期的結果沒有出現?是否有一些C++文檔指定了像這樣的情況下指針值的確切行爲,還是更像編譯器依賴的東西?

+0

誰說'(aPtr == bPtr && bPtr == cPtr)'必須是真的?你觀察到了嗎? – NathanOliver

+0

@NathanOliver當然在他的例子中,這些指針應該比較相等(隱式轉換爲公共基類型後) – Leon

+4

_「下面的表達式應該返回false」_爲什麼? 'C'包含其'B'子對象包含其'A'子對象。當多重繼承發揮作用時,你只會得到不同的結果。至於文件,是的,請閱讀系統和編譯器使用的ABI。 –

回答

2

該對象的佈局更可能與您所顯示的相反。

+----------------+ +  + 
| A (int)  | |  | 
+----------------+ | B | 
| delta B (2 int) |  | C 
+------------------+  | 
| delta C (int)   | 
+----------------------- + 

這是有道理的的aPtrbPtrcPtr數值將是相同的,當這樣的佈局被用於由編譯器。

我還沒有聽說過任何編譯器會像您建議的那樣創建對象佈局。我並不是說沒有任何東西,只是我沒有聽說過它們。

+0

你能否也請在答案中告訴它是否可以像我提出的問題,如果這是編譯器/平臺的依賴? – DawidPi

+1

@DawidPi,看我的更新。這是我能提供的最好的。 –