【发布时间】:2015-10-19 19:56:26
【问题描述】:
基类:
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(因此变量是静态的)。这是一个赋值,我们应该为APRs 使用静态成员变量。
根据我的研究和测试,我似乎找不到任何方法来覆盖CheckingAccount 类中的AddInterest() 方法以使其使用CheckingAccount::APR。如果是这种情况,那么SavingsAccount 中的大多数方法都必须被覆盖,因为许多方法使用APR,这似乎扼杀了学习继承类的意义。
我错过了什么吗?
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 是静态的,但我不确定最好的解决方案是什么。
【问题讨论】:
-
您是否将
private与protected混淆了?另外,您为什么要隐藏APR的定义?这会创建一个自变量。 -
@tadman 嗯,我还没有尝试过
protected,但我会试一试。另外,我不确定您的意思是“掩盖定义”。 -
@KyleG。阴影意味着您不能从
CheckingAccount访问SavingsAccount::APR(没有明确指定范围),因为CheckingAccount也有一个成员名称APR。虽然SavingsAccount::APR是私有的,所以无论如何你都无法在SavingsAccount之外访问它。 -
@zenith 啊,我就是这么想的。我最初设计 SavingsAccount 的目的是保持 APR 私有(在继承出现之前这很有意义),但回想起来这可能并不理想,因为 CheckingAccount 不能使用它......
-
这完全取决于你的纪律水平和你的编码实践。一般来说,像这样的验证器是供外部使用的,任何编写子类的人都应该克制自己,避免弄乱内部。仅仅在所有东西上打
private会让你的代码写起来更烦人,子类感觉就像二等公民。权力越大,责任越大!
标签: c++ class static inherited