|
Программирование >> Инициализация объектов класса, структура
ostreams NameQuery:: print( ostream sos ) const { if ( lparen ) print lparen( lparen, os ); os << name; if ( rparen ) print rparen( rparen, os ); return os; Реализация print () для класса NameQuery: class NameQuery : public Query { public: virtual ostreams print( ostream sos ) const; ... А так выглядит объявление: }; Чтобы реализация виртуальной функции в производном классе замещала реализацию из базового, прототипы функций обязаны совпадать. Например, если бы мы опустили слово const или объявили еще один параметр, то реализация print() в NameQuery не заместила бы реализацию из базового класса. Возвращаемые значения также должны 3 Увы! Правые скобки не распознаются, пока OrQuery не выведет все ассоциированное с ним частичное решение. class NotQuery : public Query { public: virtual ostream& print( ostream &os ) const; ... это нужно.) Вот объявление и реализация print() в NotQuery: ostream& N NotQuery:: print( ostream &os ) const if ( lparen ) print lparen( lparen, os ); op->print( os ); if ( rparen ) print rparen( rparen, os ); return os; Разумеется, вызов print() через op - виртуальн1й. Объявления и реализации этой функции в классах AndQuery и OrQuery практически class AndQuery : public Query { public: virtual ostream& print( ostream &os ) const; ... дублируют друг друга. Поэтому приведем их только для AndQuery: i }; быть одинаковыми за одним исключением: значение, возвращенное реализацией в производном классе, может принадлежать к типу класса, который открыто наследует классу значения, возвращаемого реализацией в базовом классе. Если бы реализация из базового класса возвращала значение типа Query*, то реализация из производного могла бы возвращать NameQuery*. (Позже при работе с функцией clone() мы покажем, зачем cout << Б1л сформулирован запрос ; Query *pq = retrieveQuery(); в поток класса ostream или любого другого, производного от него: pq->print( cout ); Однако такой возможности недостаточно. Еще нужно уметь распечатывать любой производный от Query тип, который уже есть или может появиться в будущем, с Query *pq = retrieveQuery(); cout << В ответ на запрос помощью оператора вывода из библиотеки iostream: << получен! следящие результаты:\n ; М1 не можем непосредственно предоставить виртуальн1й оператор вывода, поскольку они являются членами класса ostreami. Вместо этого mi должны написать косвенную inline ostreams operator<<( ostream sos, const Query sq ) { виртуальн вызов print() return q.print( os ); виртуальную функцию: AndQuery query; сформулировать запрос Строки ostreams AndQuery:: print( ostream sos ) const { if ( lparen ) print lparen( lparen, os ); so<->print( os ); rop->print( os ); if ( rparen ) print rparen( rparen, os ); return os; Такая реализация виртуальной функции print () позволяет вывести любой подтип Query
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |