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

Me *_*d I 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 10

有什么不对的是你没有检查重新调整的指针是什么NULL.

dynamic_cast告诉你指向的实际对象a是否属于类型b,显然不是.在这种情况下,它将返回给你一个NULL.

基本上,您正在取消引用NULL指针,导致未定义的行为,不幸的是,您不会崩溃.

使用语言提供的功能时,应按照标准规定的方式使用.使用dynamic_cast保证NULL检查返回的指针.

您的指针a实际上应指向派生类对象b.你需要:

   A* a = new B();
   B* b = dynamic_cast<B*>(a);
Run Code Online (Sandbox Code Playgroud)

此外,您的代码必须检查返回的指针:

   if(b != NULL)
       (*b).f();
Run Code Online (Sandbox Code Playgroud)


asc*_*ler 7

这一行:

B* b = dynamic_cast<B*>(a);
Run Code Online (Sandbox Code Playgroud)

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

接下来的行是Undefined Behavior.(你很幸运,没有任何事情发生过.)