qué - programacion orientada a objetos ejemplos c++
¿Cuál es el orden en que se llaman los destructores y los constructores en C++? (4)
Además, tenga en cuenta que mientras los elementos de la matriz se construyen primero -> último, se destruyen en el orden inverso: último -> primero.
¿Cuál es el orden en que se llaman los destructores y los constructores en C ++? Usando los ejemplos de algunas clases base y clases derivadas
Debo agregar a las respuestas anteriores porque todo el mundo parece estar ignorando
Cuando se crea una instancia de clase derivada , es cierto que el código dentro del constructor de la base se invocará antes que el código dentro del constructor del derivado , pero tenga en cuenta que el derivado todavía se "creó" técnicamente antes del código. base .
Y cuando se llama al destructor de clase derivado , es cierto que el código dentro del destructor derivado se llama antes que el código dentro del destructor base, pero también se debe tener en cuenta que la base se destruye antes que el derivado .
Cuando digo " creado / destruido ", en realidad me estoy refiriendo a los asignados / desasignados .
Si observa el diseño de la memoria de estas instancias, verá que la instancia derivada compone la instancia base. Por ejemplo:
Memoria de derivado: 0x00001110 a 0x00001120
Memoria de la base: 0x00001114 a 0x00001118
Por lo tanto, la clase derivada debe asignarse ANTES de la base en la construcción. Y la clase derivada debe ser desasignada DESPUÉS de 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
}
Entonces, si creó Derived d;
y si fuera del alcance, obtendrá la salida en la respuesta de @ Brian. Pero el comportamiento del objeto en la memoria no está realmente en el mismo orden, es más como esto:
Construcción:
Derivada derivada
Base asignada
Constructor base llamado
Constructor derivado llamado
Destrucción:
Derivador derivado llamado
Destructor base llamado
Base desasignada
Derrumbado Derivado
Una descripción detallada de estos eventos, incluida 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 orden es:
- Constructor base
- Constructor derivado
- Derivador derivado
- Destructor base
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 del ejemplo:
Construye B
Construye D
Destruir D
Destruir B
Múltiples niveles de herencia funcionan como una pila:
Si considera empujar un elemento en la pila como construcción y quitárselo como destrucción, entonces puede ver múltiples niveles de herencia como una pila.
Esto funciona para cualquier cantidad de niveles.
El ejemplo D2 deriva de D deriva de B.
Presione B en la pila, presione D en la pila, presione 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 obtener ejemplos más complicados, consulte el enlace proporcionado por @JaredPar