2011-01-29 10 views
5

Załóżmy, że mam kilka klas, takich jak ten przykład.Obiekty z pamięcią dziedziczenia pamięci

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; 
    } 
}; 

Teraz, w obiekcie klasy C, czy zmienne są przechowywane w określony sposób? Wiem, co dzieje się w obiekcie POD, ale to nie jest obiekt POD ...

Odpowiedz

2

we wstępie rozdziału 10, uzyskiwane klas C++ Standardem:

Kolejność, w której każdej klasy bazowej przydziela w obiekcie najbardziej pochodne (1,8) jest nieokreślona.

Tak w przykładzie C obiekty dysponują klasy bazowej podobiekt typu A i klasy bazowej podobiekt typu B, ale czy członek A baza jest przed lub po członkiem B baza jest nieokreślona.

0

Chociaż nie jestem pewien, czy jest to wymagane przez standard, w jakiejkolwiek rozsądnej implementacji jestem świadomy, że są one przechowywane w tym kolejność: A :: k, A :: m, B :: k, B :: m, C :: k, C :: m (ewentualnie wyrównane zgodnie z wymaganiami sprzętu). Jedyną praktyczną przyczyną tej wiedzy, którą mogę wymyślić, jest to, że musisz zrozumieć, że jeśli rzucisz wskaźnik C na wskaźnik do B, to jego wartość (adres) będzie inna, więc powinieneś bardzo uważać na takie rzuca (nie używaj na przykład reinterpret_cast <>).

+0

Jest tak prawdopodobnie w przypadku wielu implementacji, ale nie sądzę, że jest jakakolwiek gwarancja. –

+0

@jdv, prawda, to prawdopodobnie specyfika implementacji, ale nie mogę wymyślić innego sposobu, w jaki można go zaimplementować. Powinien jednak dodać notatkę do odpowiedzi. –

Powiązane problemy