¿Cuál es el orden en que se llaman los destructores y los constructores en C++? Utilizando los ejemplos de algunas clases de base y clases derivadas¿Cuál es el orden en que se llaman los destructores y los constructores en C++
Respuesta
El orden es:
- Base constructor
- constructor Derivado
- destructor Derivado
- Base destructor
Ejemplo:
class B
{
public:
B()
{
cout<<"Construct B"<<endl;
}
virtual ~B()
{
cout<<"Destruct B"<<endl;
}
};
class D : public B
{
public:
D()
{
cout<<"Construct D"<<endl;
}
virtual ~D()
{
cout<<"Destruct D"<<endl;
}
};
int main(int argc, char **argv)
{
D d;
return 0;
}
salida de ejemplo:
Construct B
Construct D
Destruct D
Destruct B
múltiples niveles de herencia funciona como una pila:
Si se tiene en cuenta que empuja un elemento en la pila como la construcción, y quitarse la destrucción, a continuación, se puede ver en múltiples niveles de herencia como una pila.
Esto funciona para cualquier cantidad de niveles.
Ejemplo D2 deriva de D se deriva de B.
Empuje B en la pila, empuje D en la pila, empuje D2 en la pila. Entonces, el orden de construcción es B, D, D2. Luego, para descubrir la orden de destrucción, comience a aparecer. D2, D, B
ejemplos más complicados:
Para ejemplos más complicados, consulte el enlace proporcionado por @JaredPar
Una descripción detallada de estos eventos, incluyendo la herencia virtual y múltiple está disponible en C++ FAQ Lite. Sección 25.14 y 25,15
https://isocpp.org/wiki/faq/multiple-inheritance#mi-vi-ctor-order
El enlace proporcionado está muerto . – jbx
Ahora el enlace funciona bien. –
Además, tenga en cuenta que mientras que elementos de la matriz se construyen primero -> última, que se destruyen en el orden inverso: el pasado -> primero.
+1 Eso es cierto para casi todo. El orden de destrucción es siempre lo opuesto a la construcción. Las variables estáticas no tienen un orden de construcción garantizado, pero la destrucción ocurrirá en orden inverso. –
¿Es eso (esperado) el comportamiento de contenedor templado y/o el comportamiento incorporado 'new []'/'delete []'? – franji1
debo añadir a las respuestas anteriores porque todo el mundo parece ignorar que
Cuando se tiene un deriva instancia de clase siendo creado, es cierto que el código dentro el constructor de la base de se llamará antes el código dentro el constructor de la deriva, pero tenga en cuenta que la deriva es todavía técnicamente "creado"antes la base de.
Y cuando se tiene la destructor de la clase derivada de ser llamado, es cierto que el código dentro el destructor derivada se llama antes el código dentro el destructor de base, sino también mantener en cuenta que la base de es destruidosantes de la deriva.
Cuando digo creada/destruidos De hecho, me refiero a asignado/desasignado.
Si observa el diseño de memoria de estas instancias, verá que la instancia derivada compone la instancia base. Por ejemplo:
memoria de derivados: 0x00001110 a 0x00001120
memoria de la base: 0x00001114 a 0x00001118
Por lo tanto, la clase derivada debe asignarse ANTES la base en la construcción. Y la clase derivada debe desasignarse DESPUÉS la base en la destrucción.
Si tiene el siguiente código:
class Base
{
public:
Base()
{
std::cout << "\n Base created";
}
virtual ~Base()
{
std::cout << "\n Base destroyed";
}
}
class Derived : public Base
{
public:
Derived()
// Derived is allocated here
// then Base constructor is called to allocate base and prepare it
{
std::cout << "\n Derived created";
}
~Derived()
{
std::cout << "\n Derived destroyed";
}
// Base destructor is called here
// then Derived is deallocated
}
Así que si Derived d;
creado y tuvo que salir de su ámbito, por lo que recibirá la salida de @ respuesta de Brian.Sin embargo, el comportamiento de los objetos en la memoria no es realmente el en mismo orden, es de la misma familia:
construcción:
derivados asignados
Base asignados constructor
base llamada
constructor derivado llamado
Destrucción:
destructor Derivado llamado
destructor base llamada
Base desasignado
Derivado desasignar
- 1. ¿Se llaman los destructores después de un lanzamiento en C++?
- 2. Orden de constructores/destructores de llamada en herencia
- 3. Cuando elimino un pThread en C++, ¿se llaman los destructores de objetos en las pilas?
- 4. ¿Los controladores de eventos en JavaScript se llaman en orden?
- 5. ¿En qué orden se llaman los métodos de enlace UITableView?
- 6. ¿Cuál será el orden en que se llamarán los filtros?
- 7. ¿Se heredan los destructores virtuales?
- 8. Cómo hacer cumplir una orden de llamar a los destructores
- 9. ¿Cuál es el orden de los constructores en este código Java?
- 10. ¿Por qué los constructores de copia no están "encadenados" como constructores o destructores predeterminados?
- 11. ¿Son compatibles los goto y los destructores?
- 12. ¿Cuál es el sentido de dar nombres a los constructores?
- 13. Orden de constructores/inicializadores estáticos en C#
- 14. Serializar mapas que se inicializan en los constructores
- 15. C++ usando este puntero en los constructores
- 16. Comportamiento extraño de los destructores de C++
- 17. ¿Se supone que los constructores variados ocultan los generados implícitamente?
- 18. Mixins, multi-herencia, constructores, y los datos
- 19. Destructores y herencia en C++?
- 20. moldeada en los constructores de tipo C++
- 21. ¿Cuál es la utilidad de los constructores públicos en clases abstractas en C#?
- 22. Manipulando el orden de los argumentos para escribir constructores
- 23. Asegure los ensamblajes C# de personas que llaman no autorizadas
- 24. ¿Puedo combinar los constructores en C#
- 25. ¿Por qué los destructores en la cadena de herencia de esa instancia se llaman, en orden, de la mayoría derivada a la derivada mínima?
- 26. ¿Cuál es el orden relativo con el que Windows busca los archivos ejecutables en PATH?
- 27. problema con los constructores y la herencia en C#
- 28. ¿Cómo funcionan los destructores virtuales?
- 29. ¿Los constructores predeterminados se llaman automáticamente para las variables de miembro?
- 30. C++ LNK2019 error con constructores y destructores en las clases derivadas
Tal vez el OP quiere saber sobre la clase D: public A, B, C ... –
La herencia múltiple agrega cierta complejidad: http://www.gotw.ca/gotw/080.htm –