У меня есть этот код для представления банка:
class Bank {
friend class InvestmentMethod;
std::vector<BaseBankAccount*> accounts;
public:
//...
BaseBankAccount - это абстрактный класс для всех счетов в банке:
class BaseBankAccount {
public:
BaseBankAccount() {}
virtual int getInterest() const = 0;
virtual int getInvestedSum() const = 0;
virtual void increaseDepositSum(int additionalSum) = 0;
virtual void close(std::string& reason) = 0;
virtual ~BaseBankAccount() {}
};
Проблема в том, что когда я манипулирую указателями на объекты производного класса через указатели на объекты базового класса, набор методов, которые я могу вызвать, ограничен общедоступным интерфейсом BaseBankAccount - независимо от того, какой тип является объектом REAL.
Например, не у каждой учетной записи уже есть возможность увеличить вложенную сумму - поэтому я не включил этот метод в базовый класс:
class BankAccount: public BaseBankAccount {
protected:
BaseDeposit* deposit;
double sumInvested;
public:
BankAccount(int sum, int term, int inter): sumInvested(sum), depositTerm(term), interest(inter) {}
int getInterest() const { return interest; }
int getInvestedSum() const { return sumInvested; }
void prolong(int increaseTerm) {
depositTerm += increaseTerm;
}
void increaseInvestment(double addition) {
sumInvested += addition;
}
virtual ~BankAccount() {}
};
тогда я хочу назвать это:
Bank bank1(...);
bank1.accounts[i]->increaseInvestment(1000.0);
Итак, что я могу сделать, чтобы получить доступ к интерфейсу объектов производного класса в этом случае? Насколько я знаю, понижение до конкретного типа каждый раз, когда мне нужно вызывать определенную функциональность , не годится .
Создать еще один абстрактный класс, полученный из этого, чтобы расширить интерфейс?
Создать параллельную иерархию для каждого конкретного типа, который мне нужно реализовать (выглядит немного сложным)?