Программирование >>  Инициализация объектов класса, структура 

1 ... 284 285 286 [ 287 ] 288 289 290 ... 395


void Query::

display()

if ( l solution->size() ) { cout << \n\tИзвините,

<< подходящих строк в тексте не найдено.\n << endl;

set<short>::const iterator it = solution->begin(), end it = solution->end();

for ( ; it i= end it; ++it ) { int line = *it;

не будем пользоваться нумерацией строк с 0... cout << ( << line+1 << )

<< (* text file)[line] << \n;

cout << endl;

разделе):

В этом разделе мы попытались определить иерархию классов Query. Однако вопрос о том, как же построить с ее помощью структуру данных, описывающую запрос пользователя, остался без ответа. Когда мы приступим к реализации, это определение придется пересмотреть и расширить. Но прежде нам предстоит более детально изучить механизм наследования в языке C++.

Упражнение 17.3

Рассмотрите приведенные члены иерархии классов для поддержки библиотеки из упражнения 17.1 (раздел 17.1). Выявите возможные кандидаты на роль виртуальных функций, а также те члены, которые являются общими для всех предметов, выдаваемых библиотекой, и, следовательно, могут быть представлены в базовом классе. (Примечание: LibMemiber - это абстракция человека, которому разрешено брать из библиотеки различные предметы; Date - класс, представляющий календарную дату.)

всегда вызывается невиртуальная функция display() из Query. Однако она выводит разрешающее множество строк объекта того производного класса, на который указывает pq. В этом случае мы не стали полагаться на механизм виртуализации, а вынесли разделяемую операцию и необходимые для нее данные в общий абстрактный базовый класс Query. display() - это пример полиморфного программирования, которое поддерживается не виртуальностью, а исключительно с помощью наследования. Вот ее реализация (это пока только промежуточное решение, как мы увидим в последнем



class Library { public:

bool check out( LibMember* ); bool check in ( LibMember* ); bool is late( const Date& today ) double apply fine(); ostream& print( ostream&=cout );

выдать принять назад просрочил наложить штраф

Date* due date() const; Date* date borrowed() const;

string title() const;

const LibMemer* memer() const;

ожидаемая дата возврата дата выдачи

название записавшийся

Упражнение 17.4

Идентифицируйте члены базового и производных классов для той иерархии, которую вы выбрали в упражнении 17.2 (раздел 17.1). Задайте виртуальные функции, а также открытые и защищенные члены.

Упражнение 17.5

class base { ... };

(a) class Derived

(b) class Derived

(c) class Derived

(d) class Derived

public Derived { ... }; Base { ... };

private Base { ... }; public Base;

Какие из следующих объявлений неправильны:

(e) class Derived inherits Base { ... };

17.3. Доступ к членам базового класса

Объект производного класса фактически построен из нескольких частей. Каждый базовый класс вносит свою долю в виде подобъекта, составленного из нестатических данных-членов этого класса. Объект производного класса построен из подобъектов, соответствующих каждому из его базовых, а также из части, включающей нестатические члены самого производного класса. Так, наш объект NameQuery состоит из подобъекта Query, содержащего члены loc и solution, и части, принадлежащей NameQuery, - она содержит только член name.

Внутри производного класса к членам, унаследованным из базового, можно обращаться напрямую, как к его собственным. (Глубина цепочки наследования не увеличивает затраты времени и не лимитирует доступ к ним.) Например:



Nameery nq( Frost );

вызывается NameQuery::eval() nq.eval();

вызывается Query::display()

вызываем их так, как если бы они были членами производного - либо через его объект:

nq.display();

void

NameQuery::

match count()

if ( i solution )

вызывается Query:: vec2set() solution = vec2set( & loc );

return solution->size();

либо непосредственно из тела другой (или той же самой) функции-члена:

Однако прямой доступ из производного класса к членам базового запрещен, если имя

class Diffident { public: ...

protected:

int mumble;

...

class Shy : public Diffident {

public: ...

protected:

имя Diffident:: mumble скрыто string mumble;

...

последнего скрыто в производном классе:

void

NameQuery::

display partial solution( ostream &os ) {

os << name

<< is found in

<< ( solution ? solution->size() : 0) << lines of text\n ;

Это касается и доступа к унаследованным функциям-членам базового класса: mi



1 ... 284 285 286 [ 287 ] 288 289 290 ... 395

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