Рассматривали ли вы добавление virtual const std::string& getFormatted() const
в вызывающую сторону?
Если формат будет функцией обоих аргументов для вашего оператора, вам придется создать некую таблицу комбинаций для поиска вашего формата.
Если формат является функцией только длины печати каждого аргумента (намного проще), вы можете использовать virtual size_t getFormatLength() const
.
Примечание: print_operation () ничего не знает о вызывающей стороне, за исключением того, что она имеет функцию getFormatted (), однако вызывающая сторона получает возможность отформатировать себя на основе значения op.
Это ООП / полиморфизм на работе.
Как ответил Эндрю Маршалл в своем комментарии выше, часть ООП / инкапсуляции заключается в том, что вы не должны ничего знать о реализации вызывающей стороны.
Полиморфизм, сделанный правильно, должен попытаться инкапсулировать детали реализации в стороне от вызывающей стороны.
class myClass
{
public:
virtual std::string getFormatted( const std::string& op ) const = 0;
};
class A : public myClass
{
public:
virtual std::string getFormatted( const std::string& op ) const
{
// switch on the value of op or the length of op, etc...
return std::string( "this, formatted according to class A specs and op" );
}
};
class B : public myClass
{
public:
virtual std::string getFormatted( const std::string& op ) const
{
// switch on the value of op or the length of op, etc...
return std::string( "this, formatted according to class B specs and op" );
}
};
void print_operation(const myClass &a, const myClass &b )
{
std::string op;
if ( function == get_sum ) {
op = "plus";
} else if ( function == get_difference ) {
op = "minus";
}
std::cout << a.getFormatted( op ) << op << b.getFormatted( op );
}