2011-01-29 319 views
5

說,我有一些類這樣的例子。對象具有繼承存儲器存儲

class A { 
    int k, m; 
public: 
    A(int a, int b) { 
      k = a; 
      m = b; 
    } 
}; 

class B { 
    int k, m; 
public: 
    B() { 
      k = 2; 
      m = 3; 
    } 
}; 

class C : private A, private B { 
    int k, m; 
public: 
    C(int a, int b) : A(a, b) { 
      k = b; 
      m = a; 
    } 
}; 

現在,在C類對象中,變量是否以特定方式存儲?我知道一個豆莢裏的對象會發生,但這不是一個POD對象...

回答

2

在引進第10章,派生類的,C++標準提到:

,其中基類子對象在最派生對象(1.8)中分配的次序是不確定的。

所以,在你的榜樣每C對象有A類型的基類子對象和B類型的基類子對象,但A基座部件是否到來之前或之後B基座部件是不確定的。

0

雖然我如果它是標準所要求的不知道,在任何合理的實施,我知道他們都儲存在這個順序:A :: K,A ::米,B :: K,B ::米,C :: K,C ::米(根據硬件的要求可能對齊)。在這方面的知識,我能想到的唯一實際的原因是,你要明白,如果你投一個指針到C的指針B,那麼它的值(地址)將是不同的,所以你應該非常小心,例如強制轉換(例如,不要使用reinterpret_cast <>)。

+0

這可能是許多implemenations真實的,但我不認爲有任何的保證。 – 2011-01-29 15:04:28