ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Реализация базового и производного классов.Прежде всего конструкторы. В базовом использовался конструктор:
BankAccount::BankAccount(const char * s = "NULLBody", long an=-1, double bal = 0.0) { strncpy(fullName,s,MAX-1); fullName[MAX-1] = '\0'; acctNum = an; balance = bal; }
При определении конструктора в производном классе надо думатьи об инициализации переменных заданых в базовом классе.
Если не указано иное, то вызывается конструктор по умолчанию для базового класса, а он нам не подходит. Поэтому применим список инициализации:
Overdraft::Overdraft(const char * s = "NULLBody", long an, double bal, double ml, double r):BankAccount(s,an,bal) { maxLoan =ml; owesBank =0.0; rate =r; } Здесь указан вызов конструктора BankAccount к для инициализации компонент относящихся к базовому классу. 2-й конструктор используется для обеспечения возможности преобразования объектов типа BankAccount к типу Overdraft или что то же для создания объектов класса Overdraft на основе объектов класса BankAccount.
Overdraft::Overdraft(const BankAccount& ba, double ml, double r):BankAccount(ba) { maxLoan =ml; owesBank =0.0; rate =r; }
Вспомним, что в классе BankAccount нет явного определения конструктора копирование. Его неявная реализация – копирование всех полей объекта, что в данном случае нас полне устраивает. Метод Deposit наследуется из базового класса: void BankAccount::Deposit(double amt)
Метод Withdraw() определенен в базовом классе так: void BankAccount::Withdraw(double amt) { if (amt<=balance) balance-=amt; Else cout<<”Withdrawal amount of $”<<amt <<” exceeds your balance.\n” <<” Withdrawal canceled.\n”; }
В производном классе мы хотим определить этот метод несколько иначе. Он должен реализовывать защиту от превышения кредита с учётом возможности задолженности и отчислений в этом случае банку. В реализации учитываем, что не можем прямо обращаться к private – разделу базового класса: void Overdraft::Withdraw(double amt) { double bal = Balance(); if (amt<=bal) BankAccount::Withdraw(amt); else if ((amt<=bal+maxLoan-owesBank) { double advance = amt_bal; owesBank+=advance*(1.0+rate); cout<<"Bank advance:$"<<advance<<endl; cout<<"Finance charge:$"<<advance*rate<<endl; Deposit(advance); BankAccount::Withdraw(amt); } Else cout<<"Credit limit eceeded. Transaction canceled.\n"; }
Метод Balance() наследуется: double BankAccount::Balance() const { return balance;}
Вопросы для самоконтроля · Как выглядит список инициализаторов полей объекта в конструкторах? · Как связаны операторы new и delete в конструкторах и деструкторах? · Изложите суть наследования! · Какие виды наследования применяются в С++7 · Как выглядят списки наследования? · В каком порядке вызываются конструкторы объектов в случае применения наследования? · Каким образом можно обратиться к перекрытым методам базовых классов из производного класса и к «перекрытым» глобальным переменным? Вопросы для самостоятельного изучения · Назначение атрибута доступа protected? · Влияние атрибутов доступа в списке наследования на атрибуты доступа наследуемых элементов классов? · Назначение ключевого слова virtual в списке наследования классов? (Обратите внимание на ситуацию множественного наследования и на существенное отличие от указания virtual для методов)
Лекция 23. С++: виртуальные функции-элементы, параметризация и новые операторы приведения типов данных Не нашли, что искали? Воспользуйтесь поиском:
|