360 likes | 527 Views
By: Marc Conrad & Rob Manton University of Luton Email: Marc.Conrad@luton.ac.uk Rob.Manton@luton.ac.uk Room: D104. Object Oriented Programming Development - Polymorphism I. Introduction Non object oriented basics Classes. Inheritance Aggregation
E N D
By: Marc Conrad & Rob Manton University of Luton Email: Marc.Conrad@luton.ac.uk Rob.Manton@luton.ac.uk Room: D104 Object Oriented ProgrammingDevelopment - Polymorphism I
Introduction Non object oriented basics Classes Inheritance Aggregation Polymorphism Multifile Development Module Outline
Today’s lecture • Polymorphism I • method overloading • operator overloading
The 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.
The 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)
Types 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
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. Types 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 overriding and run-time polymorphism are specific to inheritance hierarchies and object oriented programming (more about this next week..) Types 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++. Types of Polymorphism
Method & 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();
class Creature { private: int yearOfBirth; public: void setYearOfBirth(int year) { yearOfBirth = year; } void setYearOfBirth(Creature other) { yearOfBirth = other.yearOfBirth; } int getYearOfBirth() { return yearOfBirth; } }; Example: The Creature class born1997
class Creature { private: int yearOfBirth; public: void setYearOfBirth(int year) { yearOfBirth = year; } void setYearOfBirth(Creature other) { yearOfBirth = other.yearOfBirth; } int getYearOfBirth() { return yearOfBirth; } }; Example: The Creature class These two methods are different. born1997
class Creature { private: int yearOfBirth; public: void setYearOfBirth(int year) { yearOfBirth = year; } void setYearOfBirth(Creature other) { yearOfBirth = other.yearOfBirth; } int getYearOfBirth() { return yearOfBirth; } }; Example: The Creature class These two methods are different because they have different argument types. born1997
Operator Overloading - Motivation • Question: How many function calls are involved in the following statement? a = 2 + 3
Operator 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));”
Operator Overloading • So, operators as +, -, *, <<, =, 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.
class BLT { public: bool bacon; float lettuce; int tomatoes; // Constructor: BLT(bool b, float l, int t); // … (more code) }; A Sandwich filling. may contain bacon (yes/no). a fraction of a lettuce-leaf. a number of tomato slices. Overloading Operators - Example
class BLT { public: bool bacon; float lettuce; int tomatoes; // Constructor: BLT(bool b, float l, int t); // … (more code) }; 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*/ Overloading Operators - Example
class BLT { public: bool bacon; float lettuce; int tomatoes; // Constructor: BLT(bool b, float l, int t); // … (more code) }; 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 */ Overloading Operators - Example This is the operator we want to overload
Operator Overloading - Example If we try adding the two objects together at the moment we get the expected error message
class BLT { public: bool bacon; float lettuce; int tomatoes; // Constructor: BLT(bool b, float l, int t); // … (more code) }; // 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; } Overloading Operators - Example
Overloading Operators - Example + operator overloaded to accept two BLT objects as arguments.
Overloading Operators - Example Note: return type is BLT
Overloading Operators - Example Because overloaded + operator returns a BLT object, this works!
void operator+=(BLT &x, BLT y) { bool bacon =( x.get_bacon() float lettuce =x.get_lettuce() + int toms=x.get_tomato_slices()+ x.set_bacon(bacon); x.set_lettuce(lettuce); x.set_tomato_slices(toms); } Overloading Operators - Example Where an operator like += actually needs to change the first operand, we need to use the & (call by reference) syntax
Operator 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; • } • //…
Operator Overloading += operator overloaded to accept one extra BLT object as an argument -note void return type
Operator Overloading The const keyword indicates to the compiler that you are not going to change the other BLT object in any way
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*/ Operator 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; • } • //…
Operator Overloading • Operators can also have other types as parameter: • class BLT { • // … • BLT operator*=(int factor) { • tomatoes *= factor; • lettuce *= factor; • } • //…
BLT filling1(false,0.5,2); … filling1 *= 2; ... /* Should give a filling with no bacon, 1 lettuce and 4 tomatoes */ Operator Overloading • Operators can also have other types as parameters: • class BLT { • // … • BLT operator*=(int factor) { • tomatoes *= factor; • lettuce *= factor; • } • //…
Operator Overloading • The following operators can be overloaded: • new, delete, +, -, *, /, %, ^, &, |, ~, !, =, <, >, +=, -=, *=, /=, %=, ^=, &=, |=, <<, >>, >>=, <<=, ==, !=, <=, >=, &&, ||, ++, --, , , ->*. ->, (), [] • Note that "=" has already a default behaviour. When "overloaded" it will be in fact overridden.
Operator Overloading - Interesting Observation • cout << “Hello World\n”; Overloaded << operator
Operator Overloading - Interesting Observation The << operator is overloaded to take a BLT object as an argument
Operator Overloading - Interesting Observation • BLT myFilling(1,0.5,4); • cout << myFilling << endl; Now we can perform class-specific output using the standard << syntax!
Operator 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)