13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 409 — #447<br />

✐<br />

14.3. Lista de inicializadores de un constructor<br />

int main() {<br />

C c(47);<br />

} ///:~<br />

C hereda de B y ti<strong>en</strong>e un objeto miembro ("esta compuesto de") del tipo A. Puede<br />

comparar que la lista de inicializadores conti<strong>en</strong>e las llamadas al constructor de la<br />

clase base y las constructores de los objetos miembros.<br />

La función C::f() redefine B::f(), que era heredada, y también llama a la versión de<br />

la clase base. Además, se llama a a.f(). Fíjese que durante todo este tiempo estamos<br />

hablando acerca de la redefinición de funciones durante la her<strong>en</strong>cia; con un objeto<br />

miembro que sólo se puede manipular su interfaz pública, no redefinirla. Además,<br />

al llamar a f() <strong>en</strong> un objeto de la clase C no podrá llamar a a.f() si C::f() no ha sido<br />

definido, mi<strong>en</strong>tras que sería posible llamar a B::f().<br />

Llamadas automáticas al destructor<br />

Aunque muy a m<strong>en</strong>udo sea necesario realizar llamadas explicitas a los constructores<br />

<strong>en</strong> la inicialización, nunca será necesario realizar una llamada explicita a los<br />

destructores porque sólo existe un destructor para cada clase y éste no ti<strong>en</strong>e parámetros.<br />

Sin embargo, el compilador asegura que todos los destructores son llamados,<br />

esto significa que todos los destructores de la jerarquía, desde el destructor de la<br />

clase derivada y retrocedi<strong>en</strong>do hasta la raíz, serán ejecutados.<br />

Es necesario destacar que los constructores y destructores son un poco inusuales<br />

<strong>en</strong> el modo <strong>en</strong> que llaman a su jerarquía, <strong>en</strong> una función miembro normal sólo la<br />

función <strong>en</strong> si es llamada, ninguna versión de la clase base. Si usted desea llamar a<br />

la versión de la clase base de una función miembro normal, deberá sobrecargarla y<br />

deberá llamarla explícitam<strong>en</strong>te.<br />

14.3.4. Ord<strong>en</strong> de llamada de constructores y destructores<br />

Es importante conocer el ord<strong>en</strong> de las llamadas de los constructores y destructores<br />

de un objeto con varios subobjetos. El sigui<strong>en</strong>te ejemplo muestra cómo funciona:<br />

//: C14:Order.cpp<br />

// Constructor/destructor order<br />

#include <br />

using namespace std;<br />

ofstream out("order.out");<br />

#define CLASS(ID) class ID { \<br />

public: \<br />

ID(int) { out

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!