1

仮想メソッドに問題があります。呼んだらfダメ。なんで?

#include <iostream>

struct A {
   virtual void f() const { std::cout << "In A"; }
   virtual ~A() {};
};

struct B : A {
   void f() const { std::cout << "In B"; }
};

int main()
{
   A* a = new A();

   B* b = dynamic_cast<B*>(a);

   (*b).f();


   delete a;
}

何も出力されず、エラーも発生しません。私は何を間違えましたか?

4

2 に答える 2

10

間違っているのは、返されたポインタが であるかどうかを確認しなかったことですNULL

dynamic_castが指す実際のオブジェクトaがタイプbであるかどうかを示しますが、明らかにそうではありません。そして、そのようなシナリオでは、それはあなたにNULL.

基本的に、NULLポインターを逆参照しているため、不運にもクラッシュしない 未定義の動作が発生します。

言語が提供する機能を使用する場合は、標準で義務付けられている方法で使用する必要があります。を使用すると、返されたポインタ dynamic_castのチェックが保証されます。NULL

ポインターaは、実際には派生クラス オブジェクトを指している必要がありますb。必要なもの:

   A* a = new B();
   B* b = dynamic_cast<B*>(a);

また、コードは返されたポインターをチェックする必要があります。

   if(b != NULL)
       (*b).f();
于 2013-01-13T14:02:03.093 に答える
7

この行:

B* b = dynamic_cast<B*>(a);

aは実際には を指していないため、null ポインターを提供しますB

次の行は未定義の動作です。(何も起こらなかったのは「幸運」でした。)

于 2013-01-13T14:02:39.863 に答える