He buscado en Internet y este hilo en busca de una respuesta completa de esta situación que estoy enfrentando. He leído que arrojar punteros inteligentes a los objetos no es muy inteligente. Solo quiero entender por qué está sucediendo esto. Explicaré la situación. Imaginemos esta jerarquía simple:Punteros inteligentes y manejo de excepciones
class Foo
{
public: virtual ~Foo() {}
};
typedef tr1::shared_ptr<Foo> SPFoo;
class FooInherited: public Foo { };
typedef tr1::shared_ptr<FooInherited> SPFooInherited;
Y vamos a ver este código de prueba:
int main(int argc, char** argv)
{
try
{
throw FooInherited();
}
catch(const Foo& f)
{
cout << "Foo& caught!" << endl;
}
try
{
throw SPFooInherited(new FooInherited());
}
catch(const SPFoo& f)
{
cout << "SPFoo& caught!" << endl;
}
return 0;
}
Todo compila pero en tiempo de ejecución el segundo try-catch no será ejecutados. ¿Puede alguien explicarme por qué? Especialmente si las líneas de código como funcionan perfectamente bien en tiempo de ejecución.
void function(const SPFoo& f)
{
}
...
SPFooInherited fi(new FooInherited());
function(fi);
entiendo que el problema es que SPFooInherited no hereda de SPFoo (a pesar de que FooInherited hereda de Foo), pero profundamente nos gustaría saber lo que es el compilador/RTE haciendo de manera diferente a partir del ejemplo llamada a la función al capturar una excepción no ser capaz de resolver la situación. ¿Es porque el parámetro de captura no es lo mismo que un parámetro de llamada de función? ¿Por qué funciona Foo & y SPFoo no?
Muchas gracias de antemano.
Saludos, Iker.