Да. Этот метод используется, когда вам нужно поведение виртуальных функций для реализации операторов: вы определяете свой оператор в терминах виртуальной (или абстрактной) функции и позволяете специализациям решать, как эта функция реализована.
пример:
class base
{
// yada yada yada
base& operator=(const base& other) { return assign(other); }
protected:
virtual base& assign(const base& other) = 0; // specializations will decide
// what assignment means
};
Edit: одно использования метода является возможность специализации вашего класса контролировать только часть более сложной операцию:
class database
{
public:
void execute(const std::string& query)
{
begin_transaction(); // in practice, this should be RAII
connection_.execute(query);
end_transaction();
}
protected:
virtual void begin_transaction() = 0;
virtual void end_transaction() = 0;
private:
whatever &connection_;
};
В специализациях базы данных, гипотетический mysql_database::begin_transaction
имел бы другую реализацию, чем sqlite_database::begin_transaction
.
+1. Конечно, иногда «попробуйте» приводит к таким вещам, как «y = x ++ + x ++» - что «работает», но не «работает правильно каждый раз». Так что только потому, что что-то работает, это не значит, что это приемлемо или даже правильно. –