Tengo este código para representar banco:
Manipular con punteros a objetos de clases derivadas a través de punteros a clase base objetos
class Bank {
friend class InvestmentMethod;
std::vector<BaseBankAccount*> accounts;
public:
//...
BaseBankAccount es una clase abstracta para todas las cuentas en un banco:
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() {}
};
El problema es que cuando manipulo punteros a objetos de clase derivados mediante punteros a objetos de clase base, el conjunto de métodos que puedo invocar está restringido por la interfaz pública BaseBankAccount, sin importar de qué tipo sea el objeto REAL.
Por ejemplo, no todas las cuentas tiene una opción para aumentar la cantidad ya invertida - es así, me incluyo dejase`t este método en una clase base:
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() {}
};
entonces, yo quiero llamarlo:
Bank bank1(...);
bank1.accounts[i]->increaseInvestment(1000.0);
Entonces, ¿qué puedo hacer para tener acceso a la interfaz de los objetos de clase derivados en este caso? Por lo que sé, downcasting a concreto tipo cada vez que necesito llamar a la funcionalidad específica no es bueno.
¿Crear una clase abstracta más derivada de esto para expandir la interfaz?
Crear una jerarquía paralela para cada tipo específico que necesito implementar (¿parece algo pesado que hacer?)
métodos son virtuales, por supuesto - lo siento – chester89
me parece que la forma más fácil de resolver esto es subir los campos de datos de BankAccount a su clase base – chester89