私は、この状況について私が直面している完全な 答えを探しているインターネットとこのスレッドを調べました。私はスマートを投げることを読んだ オブジェクトへのポインタはあまり巧妙ではありません。私はちょうどなぜ が起こっているのか理解したい。私は状況を説明します。スマートポインタと例外処理
class Foo
{
public: virtual ~Foo() {}
};
typedef tr1::shared_ptr<Foo> SPFoo;
class FooInherited: public Foo { };
typedef tr1::shared_ptr<FooInherited> SPFooInherited;
をそしてのは、このテストコードをチェックしてみましょう::さんはこの シンプルな階層を想像してみましょう
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;
}
すべてがコンパイルされますが、実行時に第二のtry-catchは は実行されません。誰かがなぜ私を説明することはできますか?具体的には、 のようなコード行が実行時に完全に正常に機能する場合は特にそうです。
void function(const SPFoo& f)
{
}
...
SPFooInherited fi(new FooInherited());
function(fi);
私はこの問題は、SPFooInheritedは(FooInheritedがfooから継承していても)SPFooから継承していないということですが、それは深く/ RTEは、関数呼び出しの例とは異なるコンパイラやっていることを知っているしたいことを理解しません状況を解決できない例外をキャッチするとき。 catchパラメータが関数呼び出しパラメータと同じではないためですか?なぜFoo &が動作し、SPFooが動作しないのですか?
ありがとうございます。
よろしくお願いします。 Iker。