Исходное наследование С++, поставленное моим компилятором?
#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()
.
Это компилятор ошибок? Я подозреваю, что проблема связана с маскировкой имени, но я совсем не уверен.
Ответы
Ответ 1
Он называется скрытием имени, любое производное поле класса скрывает все перегруженные поля с тем же именем во всех базовых классах. Чтобы сделать этот метод доступным в Test
, добавьте директиву using
, т.е.
using Base::ok;
где-то в области Test
. Подробнее см. .
Ответ 2
Нет. Это не ошибка. Именно то, что полученный class Test
скрывает метод Base::ok()
из-за того же имени. Просто выполните следующие действия и он должен работать:
class Test : public Base
{
public:
using B::ok; // no need to declare parameters; it will allow all ok()
...
};