Al encontrar la respuesta para this query con el código de escritura de prueba, llegué a saber que la herencia privada/protegida cambia la forma en que se reciben las excepciones de varias clases, lo que fue muy sorprendente. Para encontrar la respuesta, me referí a preguntas anteriores del foro y me encontré con this similar question.¿Por qué la herencia influye en el manejo de excepciones?
Para mí es bastante obvio usar la herencia protected
para una clase base con los métodos virtual
. Manteniendo el estándar a un lado, quería saber ¿por qué en C++ el manejo de excepciones está restringido por herencia cuando las llamadas al método virtual no son? siguiente fragmento explica:
struct Base { virtual void printError() = 0; };
class Derived : protected Base { void printError() { } };
int main()
{
try {
throw new Derived;
}
catch(Base *p) { p->printError(); } // Ideal; but not invoked
catch(void *p) { ((Base*)p)->printError(); } // Ugly; but only way to invoke
}
Editar: Si tenemos en cuenta la relación privacidad como una respuesta; aceptado. ¿Pero por qué es aplicable solo para catch()
recibiendo punteros base, mientras que no es aplicable para funciones que reciben punteros base?
+1 buena pregunta. – Nawaz
nota menor, no tiene que usar 'new' en las instrucciones' throw', solo corre el riesgo de presentar pérdidas de memoria al hacerlo. En su lugar use 'throw Derived();' y capture por referencia 'Base &'. Además, definitivamente no es obvio para mí por qué alguien usaría la herencia 'protected' si la clase base tiene métodos virtuales, creo que aquí tienes algo mal ... Y finalmente, la clase de excepciones generalmente debería heredar de' std :: exception' y sobrecarga 'char const * what() const'. –
@Matthieu, gracias, pero el código anterior era solo para fines de demostración. La captura por referencia no es posible en este caso ya que no puede capturar 'void &'; Sin embargo, también prefiero la captura por referencias. Dependiendo de mi diseño, me gustaría que los métodos de clase Interface (aquí 'Base') (especialmente virtuales) no sean llamados por ninguno de sus hijos en otros espacios de nombres. – iammilind