|
|
Два описания функций с одинаковыми именами относятся к одной и той же функции, если они находятся в одной области видимости и имеют идентичные типы параметров ($$R.13). Функция-член производного класса относится к иной области видимости, чем функция-член базового класса с тем же именем. Рассмотрим пример:
class B { public: int f(int); }; class D : public B { public: int f(char*); };
Здесь D::f(char*) скорее скрывает B::f(int), чем перегружает эту функцию.
void h(D* pd) { pd->f(1); // ошибка: D::f(char*) скрывает B::f(int) pd->B::f(1); // нормально pd->f("Ben"); // нормально, вызов D::f }
Функция, описанная локально, находится в иной области видимости, чем функция с файловой областью видимости.
int f(char*); void g() { extern f(int); f("asdf"); // ошибка: f(int) скрывает f(char*) поэтому // в текущей области видимости нет f(char*) }
Для разных вариантов перегруженной функции-члена можно задать разные правила доступа, например:
class buffer { private: char* p; int size; protected: buffer(int s, char* store) { size = s; p = store; } // ... public: buffer(int s) { p = new char[size = s]; } };
| |