基类和派生类私有成员变量的使用

Base Class and Derived Class private member variable usage

本文关键字:变量 成员 派生 基类      更新时间:2023-10-16

我开发了一个不同账户的编译银行系统。我的基类是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的"副本",每个实例中只有一个balancebalance字段属于Account类,无论这个类是否通过继承扩展,都不会改变这一点。

逻辑是:CheckingAccount(从外部类的角度来看),Accountbalance,因此Checkingbalance。只有一个balance,即privately,由CheckingAccount部分控制。