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是否属于 type 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它实际上并不指向 a B

下一行是未定义的行为。(你“幸运”什么都没发生。)

于 2013-01-13T14:02:39.863 回答