Базовый класс:
class SavingsAccount
{
public:
void AddInterest(); // add interest to balance based on APR (interest rate)
private:
static double APR;
double Balance;
}
class CheckingAccount: public SavingsAccount
{
private:
static double APR;
}
Я упустил ненужные элементы / методы и т. Д. Для простоты.
Итак, вот ситуация: CheckingAccount
должен действовать так же, как SavingsAccount
Однако он должен иметь другой APR (процентная ставка). Все SavingsAccounts
делить то же самое APR
и все CheckingAccounts
поделиться своими APR
(следовательно, переменные являются статическими). Это для назначения, и мы должны использовать статические переменные-члены для APR
s.
Судя по моим исследованиям и тестам, я не могу найти способ обойти AddInterest()
метод в CheckingAccount
класс, чтобы использовать его CheckingAccount::APR
, Если это так, то большинство методов из SavingsAccount
придется переопределить, так как многие используют APR
, который, кажется, убивает смысл обучения наследовать класс.
Я что-то пропустил?
AddInterest()
метод, для справки:
SavingsAccount::AddInterest()
{
double interest = (this->APR/100)/12 * this->getBalance();
this->setBalance(this->getBalance() + interest);
}
РЕДАКТИРОВАТЬ: исходная проблема, с которой я столкнулся (до переопределения APR в CheckingAccount
) было следующее:
int main()
{
SavingsAccount sav;
CheckingAccount chk;
sav.setAPR(0.2);
chk.setAPR(0.1);
cout << sav.getAPR() << endl; // OUTPUTS "0.1"!!
return 0;
}
Модификация АТР CheckingAccount
объекты изменяет APR
из SavingsAccount
объекты! Это имеет смысл для меня, так как APR
статичен, но я не уверен, что это лучшее решение.
Я бы предложил другую иерархию классов:
class Account {};
class SavingsAccount : public Account {};
class CheckingAccount : public Account {};
а затем добавить virtual
функция-член Account
:
virtual double getAPR() = 0;
а затем реализовать Account::AddInterest()
с помощью getAPR()
,
class Account
{
public:
virtual ~Account() {}
// Add other functions as needed
// ...
void AddInterest()
{
// Implement using getAPR()
double interest = (this->APR/100)/12 * this->getBalance();
this->setBalance(this->getBalance() + interest);
}
virtual double getAPR() = 0;
private:
double Balance;
};
class SavingsAccount : public Account
{
public:
virtual double getAPR() { return APR; }
private:
static double APR;
}
class CheckingAccount : public Account
{
public:
virtual double getAPR() { return APR; }
private:
static double APR;
}
Других решений пока нет …