Информационно-безопасные системы. Анализ проблемы: Учебное пособие, страница 19

Деструктор введен с целью иллюстрации синтаксиса, поэтому тело его пусто. Имея два конструктора, можно более гибко работать с объектами класса. Теперь появляется возможность инициализировать объект при его определении.

Пример 5.5

main ()

{

Coord f("Boeing", 10, 20, 30), b;

// Для объекта f сработает конструктор с параметрами.

// Тип цели получит значение строки символов "Boeing".

// Координаты цели f получат значения х=10, у=20, z=30.

// Для объекта b сработает конструктор без параметров.

Возможность иметь более одного конструктора повышает гибкость манипуляции объектами, не снижая возможностей контроля доступа к внутренней структуре данных.

5.4. Производные классы и наследование данных

Гибкость языка программирования в значительной степени определяется величиной трудозатрат, необходимых для подстройки существующих программных модулей к новым, несколько отличающимся требованиям заказчика ПО. Именно здесь прояв­ляются преимущества ООП. Степень полезности уже разработанных частей ПО сильно повышается, если существует возможность, не изменяя того, что уже написано и отла­жено, добавлять новые свойства, модифицировать функционирование или убирать не­нужные элементы, унаследуя при этом большую часть полезных свойств. Необходи­мо учитывать тот факт, что с течением времени в распоряжение разработчика ПО предоставляется все большее число уже созданных классов и методов, которые объединяют­ся в иерархии классов и подклассов, а затем и в библиотеки. Пользователю остается определить объекты, принадлежащие этим классам и посылать им сообщения. При этом контроль безопасности ПО сводится к анализу модулей описания классов ("правил игры"). Вникать в тонкости реализации отдельных методов нет необходимости. Если библиотечный класс не в полной мере подходит к нуждам разработчика, то можно соз­дать класс, производный от базового, изменить в нем то, что следует, и работать с объ­ектами вновь полученного производного класса.

Производный класс является основой для реализации механизма наследования черт базового (родительского класса), а также средством подстройки класса к нуждам разработчика. Подкласс может унаследовать либо все данные и методы базового класса, либо часть из них. В дополнение он может приобрести новые данные и методы, не содержащиеся в базовом классе, но необходимые для конкретных долей, преследуемых при создании подкласса. При этом данные и методы базового класса, которые не долж­ны быть доступны в производные классах следует размещать в секции 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)                  // Автовызов конструктора базового класса