1
4

3 に答える 3

4

コンパイラ&aへのポインタとして認識しますA。そうでない場合はコンパイルされません。

しかし、あなたのコードを見てください:&aは常に へのポインタAであり、決して へのポインタではありませんB! type のオブジェクトA(非ポインター、定義したような実際のオブジェクトa) が type のオブジェクトでないことは不可能ですA。書き留めてもばかげているように聞こえます。

あなたの例で&aは、常に、定義(定義A a)により へのポインターでAあり、 ではないBため、コンパイラーはあなたが何か愚かなことをしていることを知らせています。ifところで-これを最適化してコンパイルすると、実際の実行可能ファイルはキャストを試みず、ステートメントを評価しません。おそらく、コードを次のように変換します。

A a;
cout << "Bad cast"<<endl;

答えを事前に知っているものをすべて削除します。

于 2013-08-03T07:18:56.610 に答える
2

コンパイラが伝えているのは、ポインターが B のインスタンスを指すことは決してないため、b常に null であるということだけです。

コンパイラはそれをポインタとして正しく認識しています。疑わしい動作にフラグを立てることで、あなたを助けようとしているだけです。これはエラーではなく警告です。

于 2013-08-03T07:10:21.190 に答える
0

a は具体的なオブジェクトであり、具体的なオブジェクトはそのサブクラスを指すことはありません。dynamic_cast は、ポインターと参照でのみ機能します。

A *ptr;
B *b, b1;

ptr = &b1;

b = dynamic_cast<B*>(ptr);

if(b == nullptr){
  cout << "Bad Cast" << endl;
}

試してみてください。

于 2020-07-30T11:36:11.387 に答える