我遇到的问题是派生类在从基类指针调用时没有调用它自己的函数版本。为了更好地解释这些类定义如下
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()
答案 0 :(得分: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();
}