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;
}
試してみてください。