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


         

которая будет вызываться из производных


class BinaryQuery : public Query {

public:

   BinaryQuery( Query *lop, Query *rop, string oper )

              : _lop(lop), _rop(rop), _oper(oper) {}

   ~BinaryQuery() { delete _lop; delete _rop; }

   ostream &print( ostream&=cout, ) const = 0;

protected:

   Query *_lop;

   Query *_rop;

   string _oper;

};

Вот как реализована в BinaryQuery функция print(), которая будет вызываться из производных классов AndQuery и OrQuery:

inline ostream&

BinaryQuery::

print( ostream &os ) const

{

   if ( _lparen )

            print_lparen( _lparen, os );

   _lop->print( os );

   os << ' ' << _oper << ' ';

   _rop->print( os );

   if ( _rparen )

            print_rparen( _rparen, os );

   return os;

}

Похоже, мы попали в парадоксальную ситуацию. С одной стороны, необходимо объявить этот экземпляр print() как чисто виртуальную функцию, чтобы компилятор воспринимал BinaryQuery как абстрактный базовый класс. Тогда в приложении определить независимые объекты BinaryQuery будет невозможно.

С другой стороны, нужно определить в классе BinaryQuery виртуальную функцию print() и уметь вызывать ее через объекты AndQuery и OrQuery.

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

inline ostream&

AndQuery::

print( ostream &os ) const

{

   // правильно: подавить механизм виртуализации

   // вызвать BinaryQuery::print статически

   BinaryQuery::print( os );

}


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