Программирование >>  Программирование на языке c++ 

1 ... 41 42 43 [ 44 ] 45 46 47 ... 159


В ЭТОМ случае мы хотим вывести на экран заголовок руководства программиста. Подчеркнем сказанное еще раз. Поскольку 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. Доступ к компонентам базового и производного классов через указатели на базовый и производный классы



1 ... 41 42 43 [ 44 ] 45 46 47 ... 159

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