Деструктор введен с целью иллюстрации синтаксиса, поэтому тело его пусто. Имея два конструктора, можно более гибко работать с объектами класса. Теперь появляется возможность инициализировать объект при его определении.
Пример 5.5
main ()
{
Coord f("Boeing", 10, 20, 30), b;
// Для объекта f сработает конструктор с параметрами.
// Тип цели получит значение строки символов "Boeing".
// Координаты цели f получат значения х=10, у=20, z=30.
// Для объекта b сработает конструктор без параметров.
Возможность иметь более одного конструктора повышает гибкость манипуляции объектами, не снижая возможностей контроля доступа к внутренней структуре данных.
Гибкость языка программирования в значительной степени определяется величиной трудозатрат, необходимых для подстройки существующих программных модулей к новым, несколько отличающимся требованиям заказчика ПО. Именно здесь проявляются преимущества ООП. Степень полезности уже разработанных частей ПО сильно повышается, если существует возможность, не изменяя того, что уже написано и отлажено, добавлять новые свойства, модифицировать функционирование или убирать ненужные элементы, унаследуя при этом большую часть полезных свойств. Необходимо учитывать тот факт, что с течением времени в распоряжение разработчика ПО предоставляется все большее число уже созданных классов и методов, которые объединяются в иерархии классов и подклассов, а затем и в библиотеки. Пользователю остается определить объекты, принадлежащие этим классам и посылать им сообщения. При этом контроль безопасности ПО сводится к анализу модулей описания классов ("правил игры"). Вникать в тонкости реализации отдельных методов нет необходимости. Если библиотечный класс не в полной мере подходит к нуждам разработчика, то можно создать класс, производный от базового, изменить в нем то, что следует, и работать с объектами вновь полученного производного класса.
Производный класс является основой для реализации механизма наследования черт базового (родительского класса), а также средством подстройки класса к нуждам разработчика. Подкласс может унаследовать либо все данные и методы базового класса, либо часть из них. В дополнение он может приобрести новые данные и методы, не содержащиеся в базовом классе, но необходимые для конкретных долей, преследуемых при создании подкласса. При этом данные и методы базового класса, которые не должны быть доступны в производные классах следует размещать в секции private. Таким образом исключается возможность доступа к критическим для безопасности данным путем, например, создания злоумышленником производного класса. В любом случае остается простота контроля доступа на уровне описаний классов.
Расширим возможности класса Coord и создадим производный от него класс Spheric, объекты которого будут иметь кроме унаследованных от родительского класса декартовых координат, еще три координаты: азимут, угол места и дальность. Для того чтобы данные х, у, z могли быть автоматически унаследованы объектами класса Spheric, необходимо, чтобы они располагались в секции protected базового класса. Именно это и было сделано при разработке класса Coord. Еще раз отметим, что при необходимости запретить доступ к переменным х, у, z в производных классах их следовало просто поместить в секции private. Теперь рассмотрим модуль описаний производного класса.
Пример 5.6
class Spheric: Coord // Объявлен класс Spheric, производный
{ // от класса Coord
private:
float f, t, d; // Полярные координаты цели
public:
// Конструктор с параметрами
Spheric (float fi, float tt, float ds, char *ty);
Spheric (): Coord () // Конструктор без параметров
{
type [0]='\0'; // Пустая строка
}
// Тело конструктора с параметрами
Spheric:: Spheric (float fi, float tt, float ds, char *ty):
Coord (ty) // Автовызов конструктора базового класса
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.