Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ООП.doc
Скачиваний:
31
Добавлен:
25.09.2019
Размер:
1.04 Mб
Скачать

14.Разрешение области видимости в производных классах

Операция разрешения области видимости :: используется для того, чтобы не было бесконечной рекурсии обращения к vec::elem() из нее самой. с помощью унарной операции :: можно ссылаться на нелокальные имена. Было бы разумно описать vec::elem() как inline, поскольку, скорее всего, эффективность существенна, но необязательно, неразумно и невозможно написать ее так, чтобы она непосредственно использовала закрытый член v класса vector. Фунции производного класса не имеют специального доступа к закрытым членам его базового класса.

Конструктор можно написать так:

vec::vec(int lb, int hb) : (hb-lb+1)

{

if (hb-lb<0) hb = lb;

low = lb;

high = hb;

}

15.Виртуальные функции.

Предположим, что мы пишем программу для изображения фигур на экране. Общие атрибуты фигуры представлены классом shape, а специальные атрибуты - специальными классами:

class shape {

point center;

color col;

//...

public:

void move(point to) { center=to; draw(); }

point where() { return center; }

virual void draw();

virtual void rotate(int);

//...

};

Функции, которые можно определить не зная точно определенной фигуры (например, move и where, то есть, "передвинуть" и "где"), можно описать как обычно. Остальные функции описываются как virual, то есть такие, которые должны определяться в производном классе. Например:

class circle: public shape {

int radius;

public:

void draw();

void rotatte(int i) {}

//...

};

Теперь, если shape_vec - вектор фигур, то можно написать:

for (int i = 0; i

16.Нестатические компонентные функции класса.

Виртуальные функции определяются в родительском классе, а в производных классах происходит их доопределение и для них создаются новые реализации. При работе с виртуальными функциями сообщения передаются как указатели, которые указывают на объект вместо прямой передачи объекту.

Виртуальной функцией может быть только нестатическая компонентная функция. Виртуальной не может быть глобальная функция.

Чтобы компонент класса был в единственном экземпляре и не тиражировался при создании каждого нового объекта, он должен быть определен в классе как статический. Различие между вызовом статического метода и динамического заключается в том, что в первом случае компилятору заранее известна связь объекта с методом и он устанавливает ее на этапе выполнения компиляции.

17.Применение виртуальных функций.

Виртуальные методы существуют для того, чтобы "наследник" вел себя отлично от "предка", сохраняя при этом свойство совместимости с ним.Виртуальный метод - это метод, который, будучи описан в потомках, замещает собой соответствующий метод везде, даже в методах, описанных для предка, если он вызывается для потомка.

Адрес виртуального метода известен только в момент выполнения программы. Когда происходит вызов виртуального метода, его адрес берется из таблицы виртуальных методов своего класса. Таким образом вызывается то, что нужно.

Преимущество применения виртуальных методов заключается в том, что при этом используется именно механизм позднего связывания, который допускает обработку объектов, тип которых неизвестен во время компиляции.