未调用派生类函数

Derived Class Function Not Called

本文关键字:类函数 派生 调用      更新时间:2023-10-16

我遇到一个问题,当从基类指针调用派生类时,它没有自己版本的函数。为了更好地解释类别定义如下

Class Foo
{
public:
  Foo();
  virtual ~Foo();
  virtual void Event();
}
//-----------------------
Class FooBar : public Foo
{
public:
  FooBar();
  virtual void Update() = 0;
  virtual void Draw() = 0;
}
//-----------------------
Class FinalFoo : public FooBar
{
public:
  FinalFoo();
  void Update();
  void Draw();
  void Event();
}

还有其他类似于FinalFoo的类。因此,我尝试在指向Foo对象的指针上调用Event,期望它会调用派生实现。然而,它似乎调用了基类版本,这就是

FinalFoo* myThing = new FinalFoo();
Foo* baseThing = myThing;
baseThing->Event();  // I expected this to call FinalFoo::Event()

假设上面的代码被更正,它实际上调用了FinalFoo::Event()。下面是一个完整且可编译的示例。请注意,它还在战略要点中添加了关键字override:我敢打赌,在原始代码中也添加override(以及使用知道该关键字的编译器进行编译)会指出您的覆盖不是一个。

#include <iostream>
class Foo
{
public:
    virtual ~Foo() {}
    virtual void Event() { std::cout << "Foo::Event()n"; }
};
//-----------------------
class FooBar : public Foo
{
public:
    virtual void Update() = 0;
};
//-----------------------
class FinalFoo : public FooBar
{
public:
    FinalFoo() {}
    void Update() override { std::cout << "FinalFoo::Update()n"; }
    void Event() override  { std::cout << "FinalFoo::Event()n"; }
};
int main()
{
    FinalFoo myThing;
    Foo* baseThing = &myThing;
    baseThing->Event();
}