让基 class 的方法使用继承的 class 的静态成员变量......可能吗?
Having a base class's method use inherited class's static member variable... possible?
基础class:
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;
}
为简单起见,我省略了不相关的 members/methods 等。
所以,情况是这样的:CheckingAccount
应该和 SavingsAccount
一样,但是它应该有不同的 APR(利率)。所有 SavingsAccounts
共享相同的 APR
,所有 CheckingAccounts
共享他们自己的 APR
(因此变量是静态的)。这是一个赋值,我们应该为 APR
s.
使用静态成员变量
根据我的研究和测试,我似乎无法找到任何方法来覆盖 CheckingAccount
class 中的 AddInterest()
方法以使其使用 CheckingAccount::APR
。如果是这种情况,那么 SavingsAccount
中的大多数方法将不得不被覆盖,因为许多方法使用 APR
,这似乎扼杀了学习继承 class 的意义。
我是不是漏掉了什么?
AddInterest()
方法,供参考:
SavingsAccount::AddInterest()
{
double interest = (this->APR/100)/12 * this->getBalance();
this->setBalance(this->getBalance() + interest);
}
编辑:我 运行 进入的原始问题(在 CheckingAccount
中覆盖 APR 之前)如下:
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
!这对我来说很有意义,因为 APR
是静态的,但我不确定最好的解决方案是什么。
我建议使用不同的 class 层次结构:
class Account {};
class SavingsAccount : public Account {};
class CheckingAccount : public Account {};
然后,向Account
添加一个virtual
成员函数:
virtual double getAPR() = 0;
然后,使用 getAPR()
.
实现 Account::AddInterest()
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;
}
基础class:
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;
}
为简单起见,我省略了不相关的 members/methods 等。
所以,情况是这样的:CheckingAccount
应该和 SavingsAccount
一样,但是它应该有不同的 APR(利率)。所有 SavingsAccounts
共享相同的 APR
,所有 CheckingAccounts
共享他们自己的 APR
(因此变量是静态的)。这是一个赋值,我们应该为 APR
s.
根据我的研究和测试,我似乎无法找到任何方法来覆盖 CheckingAccount
class 中的 AddInterest()
方法以使其使用 CheckingAccount::APR
。如果是这种情况,那么 SavingsAccount
中的大多数方法将不得不被覆盖,因为许多方法使用 APR
,这似乎扼杀了学习继承 class 的意义。
我是不是漏掉了什么?
AddInterest()
方法,供参考:
SavingsAccount::AddInterest()
{
double interest = (this->APR/100)/12 * this->getBalance();
this->setBalance(this->getBalance() + interest);
}
编辑:我 运行 进入的原始问题(在 CheckingAccount
中覆盖 APR 之前)如下:
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
!这对我来说很有意义,因为 APR
是静态的,但我不确定最好的解决方案是什么。
我建议使用不同的 class 层次结构:
class Account {};
class SavingsAccount : public Account {};
class CheckingAccount : public Account {};
然后,向Account
添加一个virtual
成员函数:
virtual double getAPR() = 0;
然后,使用 getAPR()
.
Account::AddInterest()
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;
}