#include <iostream>
class Base
{
public:
virtual void ok( float k ){ std::cout<< "ok..." << k; }
virtual float ok(){ std::cout<< "ok..."; return 42.0f; }
};
class Test : public Base
{
public:
void ok( float k ) { std::cout<< "OK! " << k; }
//float ok() { std::cout << "OK!"; return 42; }
};
int main()
{
Test test;
float k= test.ok();
return 0;
}
GCC 4.4下的编制:
hello_world.cpp: In function `int main()`:
hello_world.cpp:28: erreur: no matching function for call to `Test::ok()`
hello_world.cpp:19: note: candidats sont: virtual void Test::ok(float)
我不明白为什么测试用户无法访问Base中定义的float ok()
,即使它公开继承了它。我已经尝试使用指向基类的指针,它确实编译。取消注释float ok()
的测试实现也有效。
它是一个bug编译器吗?我怀疑与名称屏蔽有关的问题,但我完全不确定。
答案 0 :(得分:14)
它被称为名称隐藏,任何派生类字段都会隐藏所有基类中所有重载的同名字段。要在Test
中使用该方法,请添加using
指令,即
using Base::ok;
Test
范围内的某个地方。请参阅this for more information。
答案 1 :(得分:6)
没有。这不是一个错误。由于名称相同,派生class Test
隐藏了Base::ok()
方法。只需按照以下方式操作即可:
class Test : public Base
{
public:
using B::ok; // no need to declare parameters; it will allow all ok()
...
};