Title: Object Oriented Programming Development Polymorphism I
1Object Oriented ProgrammingDevelopment -
Polymorphism I
- By
- Marc Conrad Rob Manton
- University of Luton
- Email
- Marc.Conrad_at_luton.ac.uk
- Rob.Manton_at_luton.ac.uk
- Room
- D104
2Module Outline
- Inheritance
- Aggregation
- Polymorphism
- Multifile Development
- Introduction
- Non object oriented basics
- Classes
3Todays lecture
- Polymorphism I
- method overloading
- operator overloading
4The Meaning of the word.
- From the Greek
- Polus Morphe Polumorphos
- (many ) (shape/form)
- The English word "polymorphe" dates from the 19th
century and was applied to different animal forms
arising in the the same species. -
5The Meaning of the word.
- In object-oriented computing it means different
forms of data being handled by the same type of
process. - Example The operator has a different meaning
in the expression 2 3 (add two integers) than
in 1.7 3.3 (add two floating point numbers)
6Types of Polymorphism
- In Object Oriented Programming there are three
types of polymorphism - method overloading, with the special and
important case of operator overloading - method overriding
- run-time polymorphism
7Types of Polymorphism
- In Object Oriented Programming there are three
types of polymorphism - method overloading, with the special and
important case of operator overloading - method overriding
- run-time polymorphism
- Method overloading can also be applied in
non-object oriented contexts and refers both to
functions and methods.
8Types of Polymorphism
- Method overriding and run-time polymorphism are
specific to inheritance hierarchies and object
oriented programming - (more about this next week..)
- In Object Oriented Programming there are three
types of polymorphism - method overloading, with the special and
important case of operator overloading - method overriding
- run-time polymorphism
9Types of Polymorphism
- In Object Oriented Programming there are three
types of polymorphism - method overloading, with the special and
important case of operator overloading - method overriding
- run-time polymorphism
- Run-time polymorphism, also called dynamic
binding, or late binding is often considered as
the object oriented feature of C.
10Method Function Overloading
- Overloading a function simply means, that a
function is not only defined by its name but by
its name and parameter types. - The following functions are different in C
- int makeBreakfast(int i, int k)
- void makeBreakfast(Creature who)
- float makeBreakfast()
11Example The Creature class
- class Creature
- private
- int yearOfBirth
- public
- void setYearOfBirth(int year)
- yearOfBirth year
-
- void setYearOfBirth(Creature other)
- yearOfBirth other.yearOfBirth
-
- int getYearOfBirth()
- return yearOfBirth
-
born1997
12Example The Creature class
- class Creature
- private
- int yearOfBirth
- public
- void setYearOfBirth(int year)
- yearOfBirth year
-
- void setYearOfBirth(Creature other)
- yearOfBirth other.yearOfBirth
-
- int getYearOfBirth()
- return yearOfBirth
-
These two methods are different.
born1997
13Example The Creature class
These two methods are different because they have
different argument types.
- class Creature
- private
- int yearOfBirth
- public
- void setYearOfBirth(int year)
- yearOfBirth year
-
- void setYearOfBirth(Creature other)
- yearOfBirth other.yearOfBirth
-
- int getYearOfBirth()
- return yearOfBirth
-
born1997
14Operator Overloading - Motivation
- Question How many function calls are involved in
the following statement? - a 2 3
15Operator Overloading - Motivation
- Question How many function calls are involved in
the following statement? - a 2 3
- There are two functions implicitly involved
and . - Look at this statement as
- assign(a, add(2,3))
16Operator Overloading
- So, operators as , -, , ltlt, , etc. can be seen
as functions as well. That means we can
overload operators. - The C syntax uses function names prefixed
with operator for overloading operators.
17Overloading Operators - Example
- A Sandwich filling.
- may contain bacon (yes/no).
- a fraction of a lettuce-leaf.
- a number of tomato slices.
- class BLT
- public
- bool bacon
- float lettuce
- int tomatoes
- // Constructor
- BLT(bool b, float l, int t)
- // (more code)
18Overloading Operators - Example
- BLT filling1(true,0.5,2)
- BLT filling2(false,0.2,0)
- ...
- BLT filling3 filling1 filling2
- ...
- / Should give a filling with bacon, 0.7 lettuce
and 2 tomatoes/
- class BLT
- public
- bool bacon
- float lettuce
- int tomatoes
- // Constructor
- BLT(bool b, float l, int t)
- // (more code)
19Overloading Operators - Example
- BLT filling1(true,0.5,2)
- BLT filling2(false,0.2,0)
-
- BLT filling3 filling1 filling2
- ...
- / Should give a filling with 3 bacon slices,
0.7 lettuce and 2 tomatoes /
- class BLT
- public
- bool bacon
- float lettuce
- int tomatoes
- // Constructor
- BLT(bool b, float l, int t)
- // (more code)
This is the operator we want to overload
20Operator Overloading - Example
If we try adding the two objects together at the
moment we get the expected error message
21Overloading Operators - Example
- // The C Syntax
- BLT operator(BLT x, BLT y)
- bool b x.bacon y.bacon
- float l x.lettuce y.lettuce
- int t x.tomatoes y.tomatoes
- BLT result(b,l,t)
- return result
-
- class BLT
- public
- bool bacon
- float lettuce
- int tomatoes
- // Constructor
- BLT(bool b, float l, int t)
- // (more code)
22Overloading Operators - Example
operator overloaded to accept two BLT objects
as arguments.
23Overloading Operators - Example
Note return type is BLT
24Overloading Operators - Example
Because overloaded operator returns a BLT
object, this works!
25Overloading Operators - Example
- void operator(BLT x, BLT y)
-
- bool bacon ( x.get_bacon()
- float lettuce x.get_lettuce()
- int tomsx.get_tomato_slices()
- x.set_bacon(bacon)
- x.set_lettuce(lettuce)
- x.set_tomato_slices(toms)
Where an operator like actually needs to
change the first operand, we need to use the
(call by reference) syntax
26Operator Overloading
- Operators can also be overloaded as methods, e.g.
the operator - class BLT
- //
- BLT operator(BLT other)
- bacon ( bacon other.bacon)
- tomatoes other.tomatoes
- lettuce other.lettuce
-
- //
27Operator Overloading
operator overloaded to accept one extra BLT
object as an argument -note void return type
28Operator Overloading
The const keyword indicates to the compiler that
you are not going to change the other BLT object
in any way
29Operator Overloading
BLT filling1(true,0.5,2) BLT filling2(false,0.2,0
) filling1 filling2 ... /
Should give a filling with bacon, 0.7 lettuce
and 2 tomatoes/
- Operators can also be overloaded as methods, e.g.
the operator - class BLT
- //
- BLT operator(BLT other)
- bacon ( bacon other.bacon)
- tomatoes other.tomatoes
- lettuce other.lettuce
-
- //
30Operator Overloading
- Operators can also have other types as parameter
- class BLT
- //
- BLT operator(int factor)
- tomatoes factor
- lettuce factor
-
- //
31Operator Overloading
BLT filling1(false,0.5,2) filling1
2 ... / Should give a filling with no
bacon, 1 lettuce and 4 tomatoes /
- Operators can also have other types as
parameters - class BLT
- //
- BLT operator(int factor)
- tomatoes factor
- lettuce factor
-
- //
32Operator Overloading
- The following operators can be overloaded
- new, delete, , -, , /, , , , , , !, , lt,
gt, , -, , /, , , , , ltlt, gtgt, gtgt,
ltlt, , !, lt, gt, , , , --, , , -gt. -gt,
(), - Note that "" has already a default behaviour.
When "overloaded" it will be in fact overridden.
33Operator Overloading - Interesting Observation
Overloaded ltlt operator
34Operator Overloading - Interesting Observation
The ltlt operator is overloaded to take a BLT
object as an argument
35Operator Overloading - Interesting Observation
- BLT myFilling(1,0.5,4)
- cout ltlt myFilling ltlt endl
Now we can perform class-specific output using
the standard ltlt syntax!
36Operator Overloading - Summary
- Operators may be overloaded to work with user
defined data types (objects). - The syntax for overloading involves the
'operator' keyword and the operator. - Note In a good design it is important, that the
normal meanings of operators are not distorted
(don't subtract with a operator)