【发布时间】:2014-09-08 09:29:11
【问题描述】:
考虑代码:
#include <stdio.h>
class Base {
public:
virtual void gogo(int a){
printf(" Base :: gogo (int) \n");
};
virtual void gogo(int* a){
printf(" Base :: gogo (int*) \n");
};
};
class Derived : public Base{
public:
virtual void gogo(int* a){
printf(" Derived :: gogo (int*) \n");
};
};
int main(){
Derived obj;
obj.gogo(7);
}
遇到这个错误:
>g++ -pedantic -Os test.cpp -o 测试 test.cpp:在函数“int main()”中: test.cpp:31: 错误: 没有匹配函数调用`Derived::gogo(int)' test.cpp:21:注意:候选人是:virtual void Derived::gogo(int*) test.cpp:33:2:警告:文件末尾没有换行符 >退出代码:1在这里,派生类的函数正在超越基类中所有同名(非签名)的函数。不知何故,C++ 的这种行为看起来不太好。不是多态的。
【问题讨论】:
-
好问题,我也是最近才发现的
-
我认为 Bjarne(来自 Mac 发布的链接)用一句话说得最好:“在 C++ 中,没有跨范围的重载 - 派生类范围也不例外。”
-
@Ashish 该链接已损坏。这是正确的(截至目前)-stroustrup.com/bs_faq2.html#overloadderived
-
另外,想指出
obj.Base::gogo(7);仍然可以通过调用隐藏函数来工作。
标签: c++ polymorphism overriding