3 に答える
コンパイラは&aへのポインタとして認識しますA。そうでない場合はコンパイルされません。
しかし、あなたのコードを見てください:&aは常に へのポインタAであり、決して へのポインタではありませんB! type のオブジェクトA(非ポインター、定義したような実際のオブジェクトa) が type のオブジェクトでないことは不可能ですA。書き留めてもばかげているように聞こえます。
あなたの例で&aは、常に、定義(定義A a)により へのポインターでAあり、 ではないBため、コンパイラーはあなたが何か愚かなことをしていることを知らせています。ifところで-これを最適化してコンパイルすると、実際の実行可能ファイルはキャストを試みず、ステートメントを評価しません。おそらく、コードを次のように変換します。
A a;
cout << "Bad cast"<<endl;
答えを事前に知っているものをすべて削除します。
コンパイラが伝えているのは、ポインターが B のインスタンスを指すことは決してないため、b常に null であるということだけです。
コンパイラはそれをポインタとして正しく認識しています。疑わしい動作にフラグを立てることで、あなたを助けようとしているだけです。これはエラーではなく警告です。
a は具体的なオブジェクトであり、具体的なオブジェクトはそのサブクラスを指すことはありません。dynamic_cast は、ポインターと参照でのみ機能します。
A *ptr;
B *b, b1;
ptr = &b1;
b = dynamic_cast<B*>(ptr);
if(b == nullptr){
cout << "Bad Cast" << endl;
}
試してみてください。