[C con Clase] Duda sobre clases

Salvador Pozo salvador en conclase.net
Lun Mayo 20 17:44:48 CEST 2013


Hola:

Antes de nada, que sepas que no molestas en nada con tus preguntas. Pregunta todo lo que quieras.

MAj> Buneo creo que lo entendi , es que no habia visto que en la parte privada
MAj> de la clase derivada los objetos eran del tipo de la clase A.

Yo también he tardado un rato en verlo. :)

MAj> Lo que tendria que aclarar seria el orden aver si lo que digo es cohereente.
MAj> Al declarar el objeto b de tipo de la clase derivada B y enviando como
MAj> parametro 5. Claro esta todo en corchetes para que el comilador entienda
MAj> que lo que vamos a imprimir esta en los destructores.

No importa tanto el orden en que se crean como en el que se destruyen los objetos.

Efectivamente, podemos suponer que primero se crean los datos correspondientes a la clase base A, de la que se deriva la clase B. Como no es necesario especificar un constructor de la clase base, puesto que tiene uno con un parámetro con un valor por defecto, esa invocación al constructor de la clase base no aparece en el constructor de B. (Espero no haber cometido errores en este párrafo). :)

El constructor de B podría quedar de este modo (por lo que se refiere a este ejemplo, al menos):

    B(int n) : A(2), m_x(m_i + 1) , m_a(n) {}

El orden en que se crean los objetos es el mismo en que aparecen las llamadas a los constructores.

Puedes probar a cambiar el orden, y verás que el orden permanece, pero obtendrás mensajes de aviso diciendo que el orden de construcción no es el mismo en que lo has escrito.

Una vez construido el objeto B, los datos miembro tienen los valores siguientes:

m_i (de la clase base) = 2
m_x = 3
m_a = 5

Ahora vamos a los destructores.

Cuando se invoca al destructor de B, primero se muestra el valor de m_i, ya que lo primero que hay es un cout << m_i, es decir, "2".

Luego se decrementa m_i, que pasa a valer 1.

Hasta aquí no hemos destruido nada todavía.

Ahora es cuando se destruyen los miembros de b, primero m_x, y se muestra el valor "3", luego m_a, y se muestra el valor "5".

Finalmente, se destruye la clase base A de B, y se muestra m_i, que ahora vale "1".

El poner la sentencia: 
    { B b(5); }

Entre corchetes es para que el bloque se ejecute, es decir, el objeto b se crea y al finalizar el bloque (entre corchetes), se destruye.

Una pregunta: ¿de dónde sacas estos programas? Son geniales. :)


-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase