Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лек_3_слайды.doc
Скачиваний:
1
Добавлен:
17.11.2019
Размер:
457.73 Кб
Скачать

Virtual void Draw();

};

Вы еще не знаете, какие типы фигур вам потребуется, кроме того, вы захотите позже добавить новые фигуры.

Конечно, вам известно, что необходимо где-то хранить коллекцию объектов Shape, вероятно, в массиве указателей (предположим, он объявлен глобальным, и все указатели инициализированы нулевым значением):

Shape *picture[100];

//Массив указателей на объекты Shape

//массив picture м. хранить адреса //100 объектов Shape.

//Каждый элемент массива – //указатель типа shape*, который, м. //ссылаться на объект типа shape или //любого производного от него //класса.

Поскольку в классе shape определена виртуальная функция Draw(), м. запрограммировать цикл, вызывающий Draw() для указателей из массива picture:

int i = 0;

while (i< 100 && picture[i] ! = 0) {

picture[i]->Draw();

// Вызвать виртуальную функцию Draw()

i++;

}

//код, рисующий картинку до того, //как у вас появилась хотя бы одна //существующая фигура для //прорисовки!

этот код не требует точного задания типов данных объектов, на которые ссылаются указатели picture, требуется только чтобы эти объекты были производными от shape. Объекты определяют во время выполнения, какую функцию Draw() следует вызвать.

Предположим, что классы Circle (круг) и Line (линия) – потомки класса Shape:

class Circle: public Shape {

public:

Virtual void Draw();

};

class line: public shape {

public:

Virtual void Draw();

};

также необходимо запрограммировать замещающие функции Draw в классах Circle и line для отрисовки соответствующих фигур.

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

picture[0] = new Circle;

picture[1] = new Circle;

picture[2] = new Line;

picture[3] = new Circle;

picture[4] = new Line;

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

Виртуальные и невиртуальные функции-члены

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

class TValue {

protected:

Int value;

public:

TValue(int n) { value = n; }

Int GetValue(void) {return value; }

};

Можно объявить и использовать объект типа TValue, сохраняющий по требованию целочисленное значение:

TValue x(10);

// Инициализировать объект TValue x

cout << x . GetValue() << ‘\n’ ;

// Выведет 10

Затем ведем производный новый класс из TValue.

Для демонстрации возможностей производный класс умножает значение базового класса на заданное значение.

назовем этот класс TMult:

class TMult: public TValue {

protected:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]