среда, 11 августа 2010 г.

C++ Hiding Rule

Казалось бы, что не так в следующем коде:
#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

Комментариев нет:

Отправить комментарий