Ho guardato su internet e questa discussione cercando una risposta completa di questa situazione che sto affrontando. Ho letto che lanciare puntatori intelligenti su oggetti non è molto intelligente. Voglio solo capire perché sta succedendo. Spiegherò la situazione. Immaginiamo questo semplice gerarchia :Smart Pointers e gestione delle eccezioni
class Foo
{
public: virtual ~Foo() {}
};
typedef tr1::shared_ptr<Foo> SPFoo;
class FooInherited: public Foo { };
typedef tr1::shared_ptr<FooInherited> SPFooInherited;
E cerchiamo di controllare questo codice di prova:
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;
}
tutto viene compilato, ma in fase di esecuzione la seconda try-catch non sarà giustiziati. Qualcuno può spiegarmi perché? Specialmente se linee di codice come funzionano perfettamente in runtime.
void function(const SPFoo& f)
{
}
...
SPFooInherited fi(new FooInherited());
function(fi);
Capisco che il problema è che SPFooInherited non eredita da SPFoo (anche se FooInherited eredita da Foo), ma è profondamente vorrebbe sapere qual è il compilatore/RTE fare diversamente dall'esempio funzione di chiamata quando si prende un'eccezione per non essere in grado di risolvere la situazione. È perché il parametro catch non è uguale a un parametro di chiamata di funzione? Perché Foo & funziona e SPFoo no?
Grazie mille in anticipo.
Saluti, Iker.