resueltos qué programacion orientada objetos metodos herencia ejercicios ejemplos destructores constructores codigo clases c++ constructor destructor

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:

  1. Derivada derivada

  2. Base asignada

  3. Constructor base llamado

  4. Constructor derivado llamado

Destrucción:

  1. Derivador derivado llamado

  2. Destructor base llamado

  3. Base desasignada

  4. Derrumbado Derivado



El orden es:

  1. Constructor base
  2. Constructor derivado
  3. Derivador derivado
  4. 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