2014-08-21 5 views
1

Я разработал систему банковских счетов разных учетных записей. Мой базовый класс - это учетная запись, а производные классы - это проверка, сбережения, MoneyMarket. Последние три наследуют частную переменную «баланс» от учетной записи. Все счетам необходимо поддерживать и изменять свой собственный баланс.Использование переменной переменной частного класса и производного класса

Однако я смущен в отношении баланса между балансом счета и балансом производного класса.

Как вы можете видеть в getBalance(), Checking's, он вынужден использовать getBalance() из-за частной переменной, и код работает только при отображении 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); 
} 

И 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 
+0

«Все четыре счета должны поддерживать и изменять свой собственный баланс». Зачем? Что случилось с унаследованным? Я никогда не слышал о банковском счете с более чем одним балансом. – molbdnilo

+0

Привет. Точно так же, как у учетной записи Checking and Savings есть собственный баланс, так и сделайте это. Вы правы, каждый имеет только один баланс. Мой вопрос о том, какая копия «balance» CheckButance вызывается. – Student

+0

@ user2786217 'getBalance' вызывает' getBalance' 'Account', который обращается к« балансу »экземпляра' Account', который является частью экземпляра 'Checking', на который вы вызываете функцию. – user2079303

ответ

1

private означает не доступен из-за пределов видимости класса он определен в, даже в детских классах, если вы хотите для прямого доступа balance в пределах вашего детства классы сделать это protected не private.

отметить также, что наследование (по крайней мере, public наследование) означает, что ваш ребенок класс ЯВЛЯЕТСЯ родительского класс от внешнего мира и пригодный к использованию в качестве родительского класса. Таким образом, в вашем дочернем классе нет «копии» balance, в каждом случае есть один и только один balance. Поле balance принадлежит классу Account, независимо от того, распространяется ли этот класс наследование или нет, это не меняет.

Логика: Checking ЯВЛЯЕТСЯ Account (из-за пределов классовой точки зрения), Account имеет, таким образом, balanceChecking имеет balance. Существует только один balance, который является privately, который контролируется Account частью Checking.

+0

Но тогда, когда я изменяю баланс в каждом подклассе , я изменяю эту копию баланса подкласса? – Student

+0

@ user2786217 см. Мое обновление – Drax

+0

Спасибо Drax. Каково значение Checking's getBalance(), вызывающего Account :: getBalance()? Почему он просто не может изменить «баланс» вместо этого? Когда я пытаюсь использовать переменную баланса в методах проверки, я получаю ошибку «частный член». – Student

Смежные вопросы