我开发了一个不同账户的编译银行系统。我的基类是Account,派生类是Checking, Savings, MoneyMarket。后三个从Account继承私有成员变量"balance"。所有四个帐户都需要维护和修改自己的'balance'。
然而,我对帐户的余额和派生类的"余额"之间的关系感到困惑。
您可以在Checking的getBalance()中看到,由于私有变量,它被迫使用Account的getBalance(),并且代码只有在显示Account::balance时才有效。这看起来很奇怪,它应该调用Account的余额来显示它自己的余额。
请注意,所有Account的公共方法都是虚拟的,以允许重写。
为什么这个工作方式是这样的?派生类不应该调用自己的"balance"副本吗?
注意:这段代码可以正常工作,并正确显示每个对象的精确修改余额。下面是Checking.cpp:
#include <iostream>
#include <iomanip>
#include "Checking.h"
using namespace std;
Checking::Checking() {setBalance(500); }
Checking::~Checking() {setBalance(0);}
void Checking::Withdrawal(double p_withdrawal){
setBalance( getBalance(0) - p_withdrawal);
cout << setprecision(2) << fixed;
cout<<"nWithdrawal from Checking leaves balance: "<<getBalance(0);
}
double Checking::getBalance(bool print){
if (print==1)
cout<<"nBalance of Checking:"<< Account::getBalance(0);
return Account::getBalance(1);
}
And for Account.h:
#ifndef ACCOUNT_H
#define ACCOUNT_H
using namespace std;
class Account{
public:
Account();
~Account();
virtual double getBalance(bool);
virtual void setBalance(double);
virtual void Deposit(double);
virtual void Withdrawal(double);
virtual void Transfer(Account&, Account&, double);
private:
double balance;
};
#endif
private
意味着不能从它定义的类作用域外部访问,甚至不能在子类中访问,如果您想直接访问子类中的balance
,请将其改为protected
而不是private
。
public
继承)意味着您的子类是来自外部世界的父类,并且可以用作父类。因此,在您的子类中没有balance
的"副本",每个实例中只有一个balance
。balance
字段属于Account
类,无论这个类是否通过继承扩展,都不会改变这一点。
逻辑是:Checking
是Account
(从外部类的角度来看),Account
有balance
,因此Checking
有balance
。只有一个balance
,即privately
,由Checking
的Account
部分控制。