#include <iostream>
class Foo {
public:
void Fn(){std::cout<<"Foo::Fn()"<<std::endl;};
};
class Bar:public Foo {
public:
void Fn(int i){std::cout<<"Bar::Fn()"<<std::endl;};
};
int main()
{
Bar* b = new Bar;
b->Fn();
Foo* f = b;
f->Fn();
delete b;
}
GCC выдает:In function 'int main()':
Line 17: error: no matching function for call to 'Bar::Fn()'
compilation terminated due to -Wfatal-errors.
На первый взгляд это кажется очень странным. Компилятор не может найти унаследованную функцию Bar::Fn. Попробуем ему помочь в этом:class Bar:public Foo {
public:
using Foo::Fn;
void Fn(int i){std::cout<<"Bar::Fn()"<<std::endl;};
};
При таком раскладе все собирается нормально. Либо, можно убрать using, и в перегруженной функции явно вызвать функцию базового класса:
class Bar:public Foo {
public:
void Fn(){ Foo::Fn(); }
void Fn(int i){std::cout<<"Bar::Fn()"<<std::endl;};
};
Но почему так происходит? Оказывается здесь действует C++ Hiding Rule. При переопределении функций в классе-наследнике, все функции с таким же именем, но с другим прототипом унаследованные из базового класса становятся невидимыми в классе-наследнике. Это касается также и виртуальных функций.
Ссылка на FAQ
Комментариев нет:
Отправить комментарий