Базовое наследование C ++ оспаривается моим компилятором? - PullRequest
11 голосов
/ 12 июля 2011
#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)

Я не понимаю, почему float ok(), определенный в Base, недоступен для тестового пользователя, даже если он публично наследуется от него.Я попытался использовать указатель на базовый класс, и он компилируется.Раскомментирование тестовой реализации float ok() тоже работает.

Это компилятор ошибок?Я подозреваю, что проблема связана с маскировкой имени, но я совсем не уверен.

Ответы [ 2 ]

14 голосов
/ 12 июля 2011

Это называется имя, скрывающее , любое поле производного класса скрывает все перегруженные поля с одинаковым именем во всех базовых классах.Чтобы сделать метод доступным в Test, добавьте директиву using, т.е.

using Base::ok;

где-нибудь в области действия Test.См. это для получения дополнительной информации .

6 голосов
/ 12 июля 2011

Нет. Это не ошибка. Просто производное class Test скрывает метод Base::ok() из-за того же имени. Просто выполните следующее, и оно должно работать:

class Test : public Base
{
public:
  using B::ok; // no need to declare parameters; it will allow all ok()
...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...