|
Программирование >> Инициализация объектов класса, структура
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |