Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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