2011-01-29 18 views
5

Digamos que tengo algunas clases como este ejemplo.Objetos con almacenamiento de memoria de herencia

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

Ahora, en un objeto de clase C, ¿las variables se almacenan de una manera específica? Sé lo que sucede en un objeto POD, pero este no es un objeto POD ...

Respuesta

2

En la introducción del Capítulo 10, Las clases derivadas, el estándar de C++ menciones:

El orden en que los subobjetos clase base se asignan en el objeto más derivado (1.8) está especificado.

Así, en su ejemplo C objetos tienen cada uno un subobjeto de la clase base del tipo A y un subobjeto de la clase base del tipo B, pero si el miembro A base viene antes o después de que el miembro de base es B no especificado.

0

Aunque no estoy seguro si es requerido por la norma, en cualquier implementación razonable soy consciente de que están almacenados en este orden: A :: k, A :: m, B :: k, B :: m, C :: k, C :: m (posiblemente alineado según los requisitos del hardware). La única razón práctica en este conocimiento que puedo pensar es que debes entender que si lanzas un puntero a C a un puntero a B, entonces su valor (la dirección) será diferente, por lo que debes tener mucho cuidado con tal moldes (no use reinterpret_cast <> para esto, por ejemplo).

+0

Esto es probablemente cierto para muchas implementaciones, pero no creo que haya ninguna garantía. –

+0

@jdv, cierto, probablemente sea específico de la implementación, pero no se me ocurre otra forma de implementarlo. Debería agregar una nota a la respuesta, sin embargo. –

Cuestiones relacionadas