"In C we had to code our own bugs. In C++ we can inherit them." | ||
--Unknown, 1991 |
In an object-oriented language:
The complier must understand the class hierarchy.
If we extend a class, the compiler must combine the extension with the definition of the base class.
In a non-object-oriented langage:
The user must rely on the programmer documentation.
The user must define each class from scratch.
Task: Develop a new CurrentAccount
class that
extends the functionality of the Account
class.
Solution: Define a new class CurrentAccount
that inherits the functionality of account, so: Account
is the base class
of CurrentAccount
and equivalently CurrentAccount
is the derived class of Account
(i.e. CurrentAccount
IS A Account
).
What additional functionality should the CurrentAccout
class have? Well, a
current account is usually a non-interest earning account that has overdraft facilities, so we
could add:
An overdraft limit.
A facility to set this limit.
So, this can be visualised as Figure 3.2, “The Account
and CurrentAccount
class relationship.” where an overdraftLimit
state and a setOverdraft()
method have been added to the
CurrentAccount
class description. The class also inherits the states and methods
of the Account
class, i.e. balance
, accountNumber
,
display()
, makeLodgement()
and
makeWithdrawal()
.
So, inheritance allows a class to be inherited and extended with new functionality. A problem
still remains in that the display()
method that we have inherited does not
work sufficiently for the CurrentAccount
class. The display()
method
only displays the balance
and accountNumber
state details - it does not
display the overdraftLimit
. So we need to replace the behaviour (or over-ride the behaviour) of the
display()
method with an updated method that also displays the
overdraftLimit
details. So to over-ride the display method, it can simply be
re-defined in the CurrentAccount
class. This discussion is also relevant for
the makeWithdrawal()
method, as it will have to behave slightly
differently when a negative balance is reached. This inheritance structure is illustrated as in
Figure 3.3, “The extended Account
and CurrentAccount
class relationship.”.
So, inheritance allows a derived class to extend its parent with newly inherited functionality, and also allows functionality to be modified.
The definition of this new CurrentAccount
is as follows:
class CurrentAccount: public Account { float overdraftLimit; public: CurrentAccount(float bal, int actNum, float limit); virtual void setOverDraftLimit(float newLimit); virtual void display(); virtual void makeWithdrawal(float amount); };
A full source code example for this is in
CurrentAccount.cpp
The implementation/definition of these methods is as follows.
CurrentAccount::CurrentAccount(float bal, int actNum, float limit): Account(bal, actNum), overdraftLimit(limit) {} void CurrentAccount::display() { cout << "Account number: " << accountNumber << " has balance: " << balance << " Euro" << endl; cout << " And overdraft limit: " << overdraftLimit << endl; } void CurrentAccount::makeWithdrawal(float amount) { if (amount < (balance + overdraftLimit)) { balance = balance - amount; } } void CurrentAccount::setOverDraftLimit(float limit) { overdraftLimit = limit; }
© 2006
Dr. Derek Molloy
(DCU).