Предположим, что имеется иерархия классов для моделирования биржевых транзакций, то есть поручений на покупку, на продажу и т. д. Важно, чтобы эти транзакции было легко проверить, поэтому каждый раз, когда создается новый объект транзакции, в протокол аудита должна вноситься соответствующая запись. Следующий подход к решению данной проблемы выглядит разумным:
class Transaction { // базовый класс для всех
public: // транзакций
Transaction();
virtual void logTransaction() const = 0; // выполняет зависящую от типа
// запись в протокол
…
};
Transaction::Transaction() // реализация конструктора
{ // базового класса
…
logTransaction();
}
class BuyTransaction: public Transaction { // производный класс
public:
virtual void logTransaction() const = 0; // как протоколировать
// транзакции данного типа
…
};
class SellTransaction: public Transaction { // производный класс
public:
virtual void logTransaction() const = 0; // как протоколировать
// транзакции данного типа
…
};Посмотрим, что произойдет при исполнении следующего кода:
BuyTransaction b;