指向子类调用正确虚函数的指针

问题描述 投票:0回答:1
#include <iostream>

class A {
public:
  virtual void print() { std::cout << "class A" << std::endl; }
};

class B : public A {
public:
  virtual void print() override { std::cout << "class B" << std::endl; }
};

class C : public A {
public:
  virtual void print() override { std::cout << "class C" << std::endl; }
};

int main() {
  B obj1;

  A *ptr1 = dynamic_cast<A *>(&obj1);
  ptr1->print();

  B *ptr2 = dynamic_cast<B *>(ptr1);
  ptr2->print();

  C *ptr3 = dynamic_cast<C *>(ptr2);
  ptr3->print();
}

根据我的理解,当我们使用指针调用对象的虚函数时,它会搜索该对象的虚表并为我们调用匹配的函数。

但是当我尝试运行上面的代码时,它只打印两个“B 类”(前两个调用)。

看起来 ptr3 上的第三次打印将终止程序,有人可以告诉我为什么第三次 print() 失败。

c++ dynamic-cast
1个回答
0
投票

要在 C 对象上成功调用 print(),您需要创建并指向 C 对象:

enter code here
C obj2; C *ptr3 =dynamic_cast(&obj2); ptr3->print(); // 现在将打印“class C”

© www.soinside.com 2019 - 2024. All rights reserved.