OPのコメント(「スコットが述べたように、キャストがどのように失敗するのかわかりません。」)に基づいて、ここでの本当の質問は、「どのようにdynamic_cast
失敗する可能性があるのですか?」のようなものです。
失敗するのは、ターゲット タイプがオブジェクトの動的タイプと一致しない場合です。簡単な例:
struct A {
virtual ~A() {}
};
class B : public A {};
int main() {
A *a = new A;
B *b = dynamic_cast<B *>(a); // should fail
if (b == NULL)
std::cout << "First cast failed.\n";
A *c = new B;
b = dynamic_cast<B *>(c); // should succeed
if (b == NULL)
std::cout << "Second cast failed.\n";
return 0;
}
ここでは type のオブジェクトを指すことがa
できB
ますが、実際には typeのオブジェクトを指していますA
。を指すように dynamic_cast を実行しようとするとB
、失敗します。2 回目の試行では、タイプ のオブジェクトを指すことができるだけでなく、実際に指すポインターが再び得られますB
。するので、この場合は dynamic_cast がB *
成功します。
基本的な状況は、参照ケースでは (あまり) 変化せず、ただa
,ポインターではなく参照b
にc
なり、例外をキャッチすることで失敗に注意します (@ReedCopsey は、私が持っているとは思えないほど十分に実証しています)。追加する新しいもの)。