Объектно-ориентированное программирование. Богомолов А - 18 стр.

UptoLike

18
f(char[]); // идентично f(char*);
f(char[7]); // идентично f(char*);
f(char[9]); // идентично f(char*);
g(char(*)[10]);
g(char[5][10]); // идентично g(char(*)[10]);
g(char[7][10]); // идентично g(char(*)[10]);
g(char(*)[20]); // отлично от g(char(*)[10]);
Сопоставление описаний
Два описания функций с одинаковыми именами относятся к одной и той же
функции, если они находятся в одной области видимости и имеют идентичные типы
параметров. Функция-член производного класса относится к иной области видимости,
чем функция-член базового класса с тем же именем. Рассмотрим пример:
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]; }
                                            18

       f(char[]);   // идентично f(char*);
       f(char[7]); // идентично f(char*);
       f(char[9]); // идентично f(char*);
       g(char(*)[10]);
       g(char[5][10]); // идентично g(char(*)[10]);
       g(char[7][10]); // идентично g(char(*)[10]);
       g(char(*)[20]); // отлично от g(char(*)[10]);

Сопоставление описаний
       Два описания функций с одинаковыми именами относятся к одной и той же
функции, если они находятся в одной области видимости и имеют идентичные типы
параметров. Функция-член производного класса относится к иной области видимости,
чем функция-член базового класса с тем же именем. Рассмотрим пример:
        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]; }