【发布时间】: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