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

1 ... 292 293 294 [ 295 ] 296 297 298 ... 395


evaluate word: fiery lparen: 1 rparen: 0

evaluate Or lparen: 0 rparen: 0

evaluate word: shyly lparen: 1 rparen: 0

evaluate right parens: rparen: 3

( untamed ( 1 ) lines match

( fiery ( 1 ) lines match

( shyly ( 1 ) lines match

( fiery (shyly ( 2 ) lines match3

( untamed ( fiery ( shyly ))) ( 3 )

lines match

Requested query: ( untamed ( fiery ( shyly ) ) )

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her, ( 4 ) magical but untamed. Daddy, shush, there is no such thing, ( 6 ) Shyly, she asks, I mean, Daddy, is there?

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



1 ... 292 293 294 [ 295 ] 296 297 298 ... 395

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