|
Программирование >> Программирование на языке c++
В ЭТОМ случае мы хотим вывести на экран заголовок руководства программиста. Подчеркнем сказанное еще раз. Поскольку programmers guide - это разновидность book, то указатель на объект класса book (т. е. book*) можно использовать так же, как и указатель на объект класса programmers guide. Однако обратное предположение неверно. В общем случае книга (book) не является руководством программиста (programmers guide). Она может быть, например, художественной книгой. Поэтому выражение list p[20] = &b[38]; является ошибочным, так как не каждая книга является руководством программиста. Например, в этом случае было бы неясно, откуда взять значение поля level в выражении cout list p[20]->level; поскольку указатель list p[20] указывал бы на книгу Ь[38], а книга Ь[38] (как и любая другая) не имеет поля level. Общее правило здесь является следующим. Предположим, что класс derive был наследован из базового класса base с атрибутом public (более подробно атрибуты наследуемых классов будут рассмотрены позже). Тогда указатель на базовый класс pointer to base можно использовать и как указатель на производный класс. Другими словами, если pointer to derive - указатель на производный класс, то следующее выражение является правильным: pointer to base = pointer to derive; Причем здесь не надо использовать явное преобразование типов. В результате работа с объектом производного класса может осуществляться через указатель, объявленный для базового класса, который указывает на объект производного класса. Обратное утверждение неверно. Производный класс может быть в свою очередь базовым, например: class book {...}; class programmers guide : public book {...}; class WINDOWS programmers guide : public programmers guide { }; Такое множество взаимосвязанных классов называют иерархией классов, которая может быть изображена в виде ориентированного графа, состоящего из вершин и стрелок, указывающих на взаимосвязи между вершинами. На рис. 4.1 показаны различные способы доступа к компонентам базового и производного классов через указатели на базовый и производный классы. Рассмотрим примеры. Первая программа демонстрирует допустимые и запрещенные способы доступа к компонентам базового и производного классов (рис. 4.1). #include <iostream.h> class book { базовый класс char *title; public: void set data{char *t) { title=t; } void displayO { cout endl title; } char* ret title() { return title; } class programmers guide: public book { производный класс int level; public: void set data(char *t,int I) { book::set data(t); level=l; } void displayO { book::display(); cout \t level endl; } int retJevelO { return level; } void main(void) { book b,*pb; programmers guide p, *pp; b.set data( C-(~(- and Object-Oriented Programming ); p.set data( The beginner Guide to C-t-t- ,0); pb = &b; ниже в комментариях указаны результаты, выводимые на экран cout pb->ret title(); C-t-t- and Object-Oriented Programming ;лзовый КЛАСС class book ПРОИЗВОДНЫЙ КЛАСС class programmers guide указатель pb на объект класса book book *pb; pb-> доступ к этим компонентам доступ к этим компот ентам указатель рр на объект класса programmers guide programmers guide *рр; pb-> jJ£bj= pp; допустимо pp = pb; не допустимо pp-> I доступ к этим компонентам Рис. 4.1. Доступ к компонентам базового и производного классов через указатели на базовый и производный классы
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |