Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
351.74 Кб
Скачать

Void Graphics Object :: Build() { };

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

virtual тип имя_функции (список параметров=0;

Например определение класса Graphics Object может быть изменено следующим образом:

class Graphics Object {

// элементы – данные класса

……………

public:

// методы класса, необходимые для работы с любым графическим объектом

virtual void Build() =0; // построить

virtual void Display();=0; // показать на экране

// другие методы

…………..

};

В классах производных от класса Graphics Object, при наличии своих версий виртуальных функций Build() и Display() они должны быть либо определены, либо, в свою очередь, объявлены как чисто виртуальные функции.

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

Чисто виртуальные функции полезны в следующем: они позволяют установить контроль со стороны компилятора за ошибочным созданием объектов “фиктивных” типов, таких, как Graphics Object в нашем примере.

Класс с одной или большим количеством чисто виртуальных функций называется абстрактным классом.

Правила языка С++ запрещают создание объектов таких типов. Абстрактный класс может быть использован только как базовый для последующих порождений новых классов.

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

Контрольные вопросы

1.Какой принцип ООП реализует механизм виртуальных функций?

2.Когда следует использовать механизм виртуальных функций в программе?

3.В чем сущность метода динамического связывания?

4.В чем смысл идеи “один интерфейс, множество методов”?

5.В чем состоят особенности вызова виртуальной функции через указатель на класс?

6.Когда может быть проигнорирован механизм виртуальных функций?

7. Что такое абстрактный класс? Можно ли создавать объекты абстрактных классов?

8.Шаблоны функций и классов

Это еще одна реализация полиморфизма. Этого механизма не было в первых компиляторах TURBO C++ и BORLAND C++. Шаблоны позволяют создать универсальный фрагмент кода, а затем использовать его многократно с различными типами данных или различными объектами. С помощью шаблонов можно уменьшить размер и сложность программ.

8.1. Шаблоны функций

Шаблоны функций позволяют использовать в качестве аргумента функций тип переменной.

Рассмотрим следующую задачу. Нужно написать функцию cub() для возведения в третью степень передаваемого аргумента.

Можно использовать механизм перегрузки функций, и три (или более) функций будут иметь одно и то же имя, но отличаться типом аргумента и типом возвращаемого значения. Нам придется для каждого типа создавать свое тело функции, причем отличаться функции будут только типами аргументов.

Шаблоны функций обычно объявляются в заголовочном файле.

Общий вид объявления шаблона функции:

template < class T > тип возвращаемого значения имя (список параметров)

{

//тело функции

}

Здесь T - имя типа, параметр шаблона. Это указание компилятору, что T - определяемое пользователем имя типа.

Необходим, по крайней мере, один параметр T для передачи функции данных для обработки. Можно задать указатель (T * param) или ссылку (T & param).

Функция может объявлять несколько параметров и возвращать значение параметрического типа, например:

template < class T> T f(int a, T b)

{ // тело функции }

В листинге 8.1 приведен пример программы, решающей поставленную задачу.

Листинг 8.1

// Шаблон функции для возведения в куб параметра функции

template <class T>

T cub( T X)

{

return X*X*X;

};

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