Los constructores y los destructores son funciones especiales de los miembros. En general, leerá en todas partes que la construcción comienza desde el tipo menos derivado en todo el camino en la jerarquía hasta el tipo más derivado. Este es realmente el orden en que se completa la ejecución del constructor, pero no cómo se inicia la construcción.
constructores lista de inicialización orden de ejecución garantiza que, si bien el constructor del objeto más derivada será el primer constructor para comenzar a ejecutar será el último constructor para completar
Cuando se instancia un objeto al constructor más derivada que coincide la llamada de construcción se llama primero. La lista de inicialización del constructor derivado más emparentado comienza, y las listas de inicialización tienen un orden fijo: primero se llama a los constructores de las clases base en orden o apariencia dentro de la lista de herencia. A continuación, los constructores de atributo miembro se invocan en el orden en que aparecen en la declaración de clase (no en el orden en que aparecen en la lista de inicialización). Una vez completada la lista de inicialización completa (en cada nivel), se ejecuta el bloque del cuerpo del constructor, después de lo cual se completa la llamada del constructor.
Todos los destructores de base serán llamados en el orden inverso de construcción después de que el destructor más derivado haya completado la ejecución. La destrucción ocurre en el orden inverso exacto de construcción.
Los destructores son especiales de una manera diferente: no pueden ser anulados. Cuando llame al destructor más derivado de una clase, completará la ejecución del cuerpo destructor, después de lo cual se llamarán todos los destructores de atributo miembro en orden inverso de creación. Después de que el destructor más derivado se haya completado y lo hayan hecho los miembros destructores del objeto más derivado, el destructor de sus bases más directas comenzará en el orden inverso de construcción, los cuerpos del destructor se ejecutarán, luego el miembro asignará destructores y así sucesivamente. . Al final todos los elementos construidos serán destruidos.
destructores de las clases polimórficas deben ser virtual
La descripción anterior destrucción comienza con la llamada al destructor más derivada.Esto se puede lograr llamando al delete
en un puntero al tipo más derivado, cuando un objeto automático sale del alcance o cuando el objeto es delete
d a través de una clase base cuyo destructor es virtual.
Si olvida agregar la palabra clave destructor en la clase base e intenta eliminar un objeto derivado mediante un puntero a la base, llamará al destructor base directamente, y eso implica que todos los sub objetos debajo del puntero teclearán la jerarquía no será destruida apropiadamente. Todas las jerarquías de herencia en las que eliminará objetos mediante punteros a un tipo base deben tener destructores virtuales. Como regla general, si ya tiene un método virtual, el costo de hacer que el destructor sea virtual es insignificante y es una red segura. Muchas guías de codificación hacen cumplir que los destructores en las jerarquías de herencia deben ser virtuales. Algunos llegan incluso a pedir que todos los destructores sean virtuales. Esto tiene la intención de evitar posibles fugas de recursos a costa de agregar un vtable para todos los tipos y un puntero vtable para todos los objetos.
Los dos mejores maneras de obtener respuestas a preguntas sencillas C++: 1) escribir un caso de prueba sencilla (por ejemplo, poner COUTS en los constructores y destructores), y 2) ver si es contestada en http: // www. parashift.com/c++-faq-lite/ – Artelius
Por lo general, es útil que la pregunta sea relevante para lo que se está preguntando, en lugar de hacer que todos miren la descripción para ver lo que en realidad se está preguntando. –
Este código no se compila por una serie de razones. Es decir. una clase Banana no puede tener un destructor "~ MyBase()". Verifica tu código antes de publicar. –