0

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

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。所以我尝试调用Event一个指向Foo对象的指针,期望它会调用派生实现。但是,它似乎调用了基类版本,仅此而已

FinalFoo* myThing = new FinalFoo();
Foo* baseThing = myThing;

baseThing->Event();  // I expected this to call FinalFoo::Event()
4

1 回答 1

2

假设上面的代码被更正了,它实际上确实调用了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();
}
于 2013-09-01T14:57:35.833 回答