为什么我的虚函数没有被调用?

时间:2013-01-13 14:00:52

标签: c++

我遇到了虚拟方法的问题。当我致电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;
}

它根本不打印任何内容,我也没有任何错误。我做错了什么?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:7)

这一行:

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

给出一个空指针,因为a实际上并不指向B

以下行是Undefined Behavior。 (你很“幸运”,什么都没发生。)