Программирование >>  Структурное программирование 

1 ... 189 190 191 [ 192 ] 193 194 195 ... 342


#include point2.h ttinclude <iomanip.h>

class Circle : public Point { public:

конструктор с умолчанием

Circle(float r = 0.0, float x = 0, float у = 0); -Circle 0; деструктор

I private:

i float radius; радиус Circle

#endif

Рис. 9.7. Определение класса Circle (часть 3 из 5)

В части 5 представлена программа драйвер для иерархии Point - Circle. Программа начинается созданием объекта класса Point со своей собственной областью определения внутри main. Управление входит и сразу выходит из области определения этого объекта, так что вызываются и конструктор, и деструктор объекта. Затем программа создает объект circlel класса Circle. Это активизирует конструктор класса Point, осуществляющий вывод значений, переданных ему из конструктора класса Circle, затем выполняется вывод, указанный в конструкторе класса Circle. Следующим возникает объект circle2 класса Circle. Снова вызываются конструкторы классов Point и Circle. Отметим, что тело конструктора Point выполняется раньше тела конструктора Circle. При достижении конца main должны быть вызваны деструкторы объектов circlel и circle2. Деструкторы вызываются в последовательности, обратной вызовам соответствующих им конструкторов. Поэтому деструктор Point и деструктор Circle вызываются сначала для объекта circle2, а потом для объекта circlel.

CIRCLE2.CPP ? * Определения функций-элементов класса Circle #include circle2.h

Конструктор Circle вызывает конструктор Point Circle::Circle(float r, float a, float b)

: Point(a, b) вызов конструктора базового класса

radius = г;

cout << Конструктор Circle: радиус равен

radius [ << а << , << b << ] << endl;

j-i/ Деструктор класса Circle Circle:: -Circle ( )

cout << Деструктор Circle: радиус равен:

radius [ x , y ] <<endl;

}

CIRCLE2.H

Определение класса Circle #ifndef CIRCLE2 H #define CIRCLE2 Н



cout endl;

Circle circlel (4.5, 7.2, 2.9);

cout << endl;

Circle circle2(10, 5, 5);

cout endl;

return 0;

. чй! Конструктор Point: [1.1, 2.2] Деструктор Point: [1.1, 2.2]

Конструктор Point: [7.2, 2.9]

Конструктор Circle: радиус равен 4.5 [7.2, 2.9] Конструктор Point: [5, 5]

Конструктор Circle: радиус равен 10 [5, 5]

* Деструктор Circle: радиус равен: 10 [5, 5]

Деструктор Point: [5, 5]

Деструктор Circle: радиус равен: 4.5 [7.2, 2.9]

Деструктор Point: [7.2, 2.9]

Рис. 9.7. Последовательность вызовов конструкторов и деструкторов базового и производного

классов (часть 5 из 5)

9.10. Неявное преобразование объектов производных классов в объекты базовых классов

Несмотря на тот факт, что объекты производных классов являются также и объектами базового класса, типы объектов производного и базового классов различны. Объекты производных классов можно рассматривать как объекты базового класса. Это имеет смысл, потому что производный класс имеет элементы, соответствующие каждому из элементов базового класса. Но напомним, что производный обычно имеет большее количество элементов, чем его базовый класс. Поэтому присваивание объекта базового класса объекту производного класса оставило бы неопределенными добавочные элементы производного класса. Хотя такое присваивание естественным путем не

,! FIG9 7.CPP г* Демонстрация вызовов конструкторов и деструкторов базового и производного классов.

tinclude <iostream.h> tinclude point2.h I tinclude circle2.h

mainO {

Демонстрация вызовов конструктора и деструктора Point {

Point р(1.1, 2.2);



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

Типичная ошибка программирования 9.4

Присваивание объекта производного класса объекту соответствующего базового класса и затем попытка сослаться в этом новом объекте базового класса на элементы, имеющиеся только в объектах производного класса.

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

Существует четыре возможных способа комбинирования и попарного сопоставления указателей и объектов базового и производного классов:

1. Ссылка на объект базового класса с помощью указателя базового класса очевидна.

2. Ссылка на объект производного класса с помощью указателя производного класса очевидна.

3. Ссылка на объект производного класса с помощью указателя базового класса не опасна, потому что объект производного класса является также и объектом своего базового класса. Если производится ссылка с помощью указателя базового класса на элементы, имеющиеся только в объектах производного класса, компилятор сообщит о синтаксической ошибке.

4. Ссылка на объект базового класса с помощью указателя производного класса является синтаксической ошибкой. Указатель производного класса сначала должен быть приведен к типу указателя базового класса.

Типичная ошибка программирования 9.5

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

Удобно было бы рассматривать объекты производного класса как объекты базового класса и оперировать со всеми этими объектами с помощью указателей базового класса, однако здесь имеется проблема. В бухгалтерских системах, например, нам хотелось бы иметь возможность просматривать связный список служащих и вычислять для каждого из них его недельную зарплату. Но использование указателей базового класса позволяет программе вызывать для обработки платежных ведомостей только процедуру базового класса (если такая процедура в базовом классе существует). Нам нужен был бы способ активизировать процедуру обработки платежных ведомостей для любого объекта, будь он производного класса или базового класса, и делать это просто использованием указателей базового класса. Решением является использование виртуальных функций и полиморфизма; как это делать описано в главе 10.



1 ... 189 190 191 [ 192 ] 193 194 195 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика