es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

try – intentar except – excepto inheritance – herencia

¿Por qué el resultado es “B”, pensé que debía llegar primero a la clase heredada (“A”)? Cuando lo ejecuté con la clase B que no hereda nada de la clase A, llega primero al bloque catch, pero no conozco la razón de este comportamiento en el siguiente código:

“`c++
#include <iostream>
#include <exception>

using namespace std;

class A {};
class B : public A{};
class C : public A, public B {};

int main() {
try {
throw C();
}
catch (A a) {
cout << "A" << endl;
}
catch (B b) {
cout << "B" << endl;
}
catch (C c) {
cout << "C" << endl;
}
}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el resultado es “B” y no “A” se debe al orden de herencia en la clase C. Cuando la clase C hereda de la clase A y luego de la clase B, se crea lo que se llama un patrón de herencia en forma de diamante. Esto significa que cuando se lanza un objeto de la clase C, se crean los subobjetos tanto de la clase A como de la clase B, y el subobjeto de la clase A se crea primero, seguido por el subobjeto de la clase B.

    En los bloques catch, se lista el catch para la clase A antes del catch para la clase B. Sin embargo, debido a que el subobjeto de la clase B se crea en segundo lugar, se captura primero y se imprime la instrucción “B”. Si los bloques catch se listaran en orden inverso (capturando B antes que A), entonces se imprimiría la instrucción “A” en su lugar.

    Es importante tener en cuenta que capturar un objeto por valor (como se hace aquí) crea una copia del objeto, lo cual puede llevar a un recorte (slicing). Para evitar esto, se recomienda capturar objetos por referencia o por puntero.

Comments are closed.