logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.13.1 Сопоставление описаний

Два описания функций с одинаковыми именами относятся к одной и той

же функции, если они находятся в одной области видимости и имеют

идентичные типы параметров ($$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]; }

};