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

Why is my virtual function not being called?

本文关键字:调用 函数 我的 为什么      更新时间:2023-10-16

我在使用虚拟方法时遇到了麻烦。当我调用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;
}

它根本不打印任何东西,我也没有得到任何错误。我做错了什么?

您没有检查返回的指针是否为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();

这一行:

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

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

下面一行是未定义行为。(你很"幸运",什么都没发生。)