16 Overloading [over]

16.2 Declaration matching [over.dcl]

Два объявления функции с одним и тем же именем относятся к одной и той же функции, если они находятся в одной области и имеют эквивалентные объявления параметров ([over.load]). Функциональный член производного класса находится not в той же области видимости, что и функциональный член с тем же именем в базовом классе. [Example:

struct B {
  int f(int);
};

struct D : B {
  int f(const char*);
};

Здесь D​::​f(const char*) скрывается, B​::​f(int) а не перегружается.

void h(D* pd) {
  pd->f(1);                     // error:
                                // D​::​f(const char*) hides B​::​f(int)
  pd->B::f(1);                  // OK
  pd->f("Ben");                 // OK, calls D​::​f
}

end example]

Локально объявленная функция не находится в той же области видимости, что и функция в содержащей ее области. [Example:

void f(const char*);
void g() {
  extern void f(int);
  f("asdf");                    // error: f(int) hides f(const char*)
                                // so there is no f(const char*) in this scope
}

void caller () {
  extern void callee(int, int);
  {
    extern void callee(int);    // hides callee(int, int)
    callee(88, 99);             // error: only callee(int) in scope
  }
}

end example]

Разным версиям перегруженной функции-члена могут быть предоставлены разные правила доступа. [Example:

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]; }
};

end example]