#include #include class Balance { int cents_; public: explicit Balance(int cents) : cents_(cents) { if (cents < 0) throw std::invalid_argument("negative balance"); } bool withdraw(int amount) { if (amount < 0 || amount > cents_) return false; cents_ -= amount; return true; } int value() const { return cents_; } }; struct Payment { virtual bool pay(int cents) = 0; virtual ~Payment() = default; }; class Wallet final : public Payment { Balance balance_; public: explicit Wallet(int cents) : balance_(cents) {} bool pay(int cents) override { return balance_.withdraw(cents); } int remaining() const { return balance_.value(); } }; int main() { Wallet wallet(100); Payment& payment = wallet; const bool paid = payment.pay(30); const bool rejected = payment.pay(80); assert(paid && !rejected); assert(wallet.remaining() == 70); }