которая будет вызываться из производных
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 );
}
Содержание Назад Вперед