Глава 5. Наследование, виртуальные функции и полиморфизм
Создание функций преобразования типов
Иногда необходимо создать класс таким образом, чтобы иметь возможность свободно использовать его в смешанных выражениях с данными других типов. Хотя перегруженные функции-операторы могут обеспечить смешанное использование типов, иногда достаточно простого преобразования типов. В таких случаях можно использовать функцию преобразования типа, преобразующую тип класса в другой тип, совместимый с остальными членами выражения. Общая форма функции преобразования типа имеет вид:
operator(тип)() {return значение;}
Здесь тип является целевым типом, к которому преобразуется класс, а значение представляет собой значение класса после преобразования. Функция преобразования должна быть членом класса, для которого она определяется.
Чтобы проиллюстрировать создание функции преобразования типа, используем класс point еще раз. Предположим, что необходимо преобразовать объект point в целое число таким образом, чтобы оно могло использоваться в целочисленном выражении. Допустим, это преобразование будет представлять собой произведение трех координат. Для его выполнения можно определить функцию преобразования следующим образом:
operator int() { return x*у*z; }
Ниже приведена программа, иллюстрирующая работу этой функции преобразования:
cout << b+100; // вывод 124 из-за преобразования к int
cout << "\n";
return 0;
}
Как иллюстрирует данная программа, когда объект point используется в целочисленном выражении, таком как cout << b+100, используется функция преобразования объекта. В этом случае функция преобразования возвращает значение 24, которое затем прибавляется к 100.
Наследование и полиморфизм лежат в основе объектно-ориентированного программирования. С помощью наследования можно создать общий класс, определяющий общие черты совокупности объектов. Этот класс может наследоваться другими более специфическими классами, каждый из которых добавляет что-то свое.
Есть еще одна причина, по которой наследованию придается такая важность: с его помощью поддерживается полиморфизм во время выполнения программы. С помощью полиморфизма реализуется принцип «один интерфейс — множество методов».
В C++ полиморфизм поддерживается как на этапе исполнения программы, так и на этапе компиляции. В качестве примера полиморфизма на этапе компиляции можно указать перегрузку операторов и функций. Но как бы ни была полезна перегрузка операторов и функций, с их помощью нельзя решить все задачи, возникающие в объектно-ориентированном программировании. Поэтому в C++ также используют полиморфизм времени выполнения программы, для чего используются производные классы и виртуальные функции. Связанные с ними вопросы обсуждаются в этой главе. Начнем главу с подробного рассмотрения наследования.
В этом разделе мы изучим взаимодействие между спецификаторами доступа C++ и наследованием. Прежде всего, необходимо коснуться терминологии. Класс, от которого наследуется другой класс, называется базовым классом. Иногда его также называют родительским классом. Класс, выполняющий наследование, называется производным классом или потомком.