С++ для начинающих



         

Виртуальный ввод/вывод - часть 3


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?"

Реализация print() для класса NameQuery:

ostream&

NameQuery::

print( ostream &os ) const

{

   if ( _lparen )

      print_lparen( _lparen, os );

   os << _name;

   if ( _rparen )

      print_rparen( _rparen, os );

   return os;

}

А так выглядит объявление:

class NameQuery : public Query {

public:

   virtual ostream& print( ostream &os ) const;

   // ...

};

Чтобы реализация виртуальной функции в производном классе замещала реализацию из базового, прототипы функций обязаны совпадать. Например, если бы мы опустили слово const или объявили еще один параметр, то реализация print() в NameQuery не заместила бы реализацию из базового класса. Возвращаемые значения также должны быть одинаковыми за одним исключением: значение, возвращенное реализацией в производном классе, может принадлежать к типу класса, который открыто наследует классу значения, возвращаемого реализацией в базовом классе. Если бы реализация из базового класса возвращала значение типа Query*, то реализация из производного могла бы возвращать NameQuery*. (Позже при работе с функцией clone() мы покажем, зачем это нужно.) Вот объявление и реализация print() в NotQuery:

class NotQuery : public Query {

public:

   virtual ostream& print( ostream &os ) const;

   // ...

};

ostream&

NotQuery::

print( ostream &os ) const

{

   os << " ! ";

   if ( _lparen )

      print_lparen( _lparen, os );

   _op->print( os );

   if ( _rparen )

      print_rparen( _rparen, os );

   return os;

}

Разумеется, вызов print() через _op – виртуальный.

Объявления и реализации этой функции в классах AndQuery и OrQuery практически дублируют друг друга. Поэтому приведем их только для AndQuery:




Содержание  Назад  Вперед