基本的C ++继承受到我的编译器的挑战?

时间:2011-07-12 11:59:30

标签: c++ gcc

#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编译器吗?我怀疑与名称屏蔽有关的问题,但我完全不确定。

2 个答案:

答案 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()
...
};