CashFlow is an abstract base class for cash flows. The cash flow interface is implemented by many classes such as SimpleCashFlow, Coupon and many more. The multitude of different cash flows will be handled in another post. Here we will focus on the base class for all these cash flows and the simplest implementations.
CashFlow inherits from the Event interface. The Event::date() method is still left as an abstract method. The method hasOccured() is changed so that the global setting is taken into account. The Settings singleton defines a method
If set, this setting overrides any includeRefDate parameter passed to the hasOccurred() method.
The method that has been added to the CashFlow interface is the amount() method. The declaration is
virtual double amount() = 0;
This method should be implemented by a cash flow class to return the cash flow amount.
In addition to the above, the CashFlow class implements the Visitability concept. This means it has a method called accept() which accepts an AcyclicVisitor.
virtual void accept(AcyclicVisitor &v);
The visitability concept is dealt with in a separate article. Here we will only state that the accept() method attempts to convert the visitor into the Visitor<CashFlow> type using a dynamic typecast. If the cast is successful, the visit method of the visitor class is called.
The file cashflow.hpp also includes a type definition for Leg, a collection of cash flows.
typedef std::vector > Leg;
As an example consider the simplest cash flow class SimpleCashFlow. This class represents a fixed cash flow at a specific date. The constructor of this class takes a date and the amount and these values are stored internally.
SimpleCashFlow(Real amount, const Date& date);
The date() method is implemented to return the specified date, and the amount() method is implemented to return the specified amount.
Other simple cash flows
Two more cash flows exist that inherit from SimpleCashFlow without adding any more functionality. These are the classes Redemption and AmortizingPayment.
The reason for defining these two cash flows is for visitors to distinguish between different types of cash flows. Visitation is dealt with in a separate post and an example involving these cash flows is given there. Suffice to say here that these two cash flows re-implement the accept() method which attempts to call the appropriate function of the visitor passed to them.