C++で例外をキャッチすることに関して質問があります。 我々は値でキャッチしている次の例を考えてみます。例外C++:参照/値でキャッチ
struct baseException{};
struct derivedException : public baseException {};
void g(){
// Bad stuff
if(!stuff)
throw derivedException();
else
throw baseException();
}
void f(){
try{
g();
}
catch(derivedException e){
// Caught derived exc
}
catch(baseException){
// Caught base exc
}
}
はのはbaseException
がスローされたとしましょう。コンパイラはderivedException
がbaseException
の特殊化であることを理解していないので、より正確なcatch節(baseException
)を選択しますか?
derivedException
がスローされ、catch節の順序が逆転した場合、スライシングが行われることに同意しますが、この場合何が起こるかはわかりません。コンパイラがそれを特殊化として認識できないのはなぜですか?
私はそれが間違った方法であることに同意します。多形性プロパティを保存するためには常に参照する必要がありますが、コンパイラーがその特殊化を認識できない理由を知りたいと思います。
"ポリモリックプロパティを節約する"他の理由もあります。たとえば、bad_allocのために投げた場合、どうすればより多くのメモリを割り当てるのですか? – UKMonkey
あなたの質問は何もできません。あなたのコードによれば、 'derivedException'がスローされると' derivedException'が捕捉されます。 'baseException'がスローされると、' baseException'が引き起こされます。 – songyuanyao
また、コピーを避けるために参考にしてください。 – Hayt