【问题标题】:Derived Class Function Not Called未调用派生类函数
【发布时间】:2013-09-01 14:42:27
【问题描述】:

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

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()

【问题讨论】:

  • 您未能提供测试用例,因为您说的没有意义。
  • 你的最终sn-p可能是FinalFoo myThing; Foo &baseThing = myThing;
  • 在上述设置中,它确实会调用FinalFoo::Event()。但是,该示例显然不是原始代码(它包含一些错误,例如,在您的类定义之后缺少分号)并且签名中有细微的变化,这可能会阻止您认为覆盖基类虚函数的函数执行所以。如果您有 C++11,则在每个覆盖函数后添加 override,编译器会告诉您它是否确实是一个覆盖!
  • 绝对应该调用派生类实现。还有一些你没有展示的事情。
  • 您是否至少测试并确保 Event 确实 为 FinalFoo 对象 myThing 调用?另外,如果通过添加= 0 使Foo 中的Event 成为纯虚拟会发生什么?

标签: c++ polymorphism overloading


【解决方案1】:

假设上面的代码被更正了,它实际上确实调用了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();
}

【讨论】:

  • 好。我在 codepad.org 中尝试了您的代码并且它有效。之前我以为 FooBar 中也应该有 Event 的声明,显然不是这样。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2014-01-01
  • 2011-09-17
  • 2011-06-19
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多