polymorphism lecture-10. print a cheque a report a photograph printcheque() printreport()...

30
Polymorphism Lecture-10

Upload: cuthbert-foster

Post on 30-Dec-2015

220 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Polymorphism

Lecture-10

Page 2: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Print

A Cheque

A Report

A Photograph

PrintCheque()

PrintReport()

PrintPhoto()

Printing

Page 3: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Polymorphism Polymorphism derived from the Greek word Polumorphos

Polus (many) + Morphe (shape / form) = Polumorphos

In O-O it means different forms of data being being handled by the same process

This is achieved by a process know as 'Overloading' which allows functions and operators to behave differently in different contexts

The underlying philosophy of polymorphism is that it ultimately make programs easier to express as it reduces the number of different names we need to use for processes which are similar but not identical.

Page 4: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

O-O Polymorphism Polymorphism means that it is possible to 'Overload' the

symbols we use in a program so that the same symbol can have different meanings in different contexts.

A symbol can be either

operators

function (methods) names

This means that we can have two types of polymorphism

Operator Overloading

function Overloading

Page 5: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Many Types of Polymorphism

Common factor :

The ability to generalise messages sent to objects We can apply a generic name to a collection of methods

implemented differently by different classes and objects

These classes will then differ in class specific ways depending upon the object

Polymorphism devolves responsibility for interpreting a message down to the level of the objects.

Page 6: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

A Simple Example In a program we may define a methods such as Vertex or

Normal in a number of Objects

However each Vertex or Normal method would be specifically tailored to the Object in question

So an Object Point2D.Vertex would call glVertex2f and the Object Point3D.Vertex would call glVertex3f

We do not have to define the methods as 2DVertex and 3DVertex

As this makes the program less flexible, as the objects take the responsibility of generating the vertex

So we have a Objects which take the responsibility for the same message being passed

Page 7: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Categorising Polymorphic Techniques Since there are a number of different types of polymorphic

techniques it is useful to classify them

Polymorphism

Ad HocUniversal

Parametric Inclusion Overloading Coercion

Page 8: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Ah Hoc Polymorphism

Ad Hoc (Latin) means “for this purpose only”

Therefore Ad Hoc polymorphism is applied for a specific purpose rather than as a generalised context.

These forms of Polymorphism are applicable to both O-O programming as well as procedural programming.

Page 9: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

same function name function(...)

(int) (char) (char*) (double*) (floate*)

separate implementation for each version of the function

Page 10: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Universal Polymorphism

Universal Polymorphism can be applied to a general set of types

These do not have to be specifically defined

This can be done with either

parametric polymorphism (implemented with

templates)

inclusion polymorphism (implemented using

classification hierarchies)

Page 11: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Coercion C++ Syntax Arithmetic operations available in all programming

languages exhibit a form of polymorphism

In C++ we write

int x=4 + 5;

float y = 5.9 + 4.55;

In the above operations the + operator performs the same thing on two different data types (int and float)

int x=10;

float y=7.5;

double z=x*y;

Here the compiler will converts the data types so the operation may be executed.

Page 12: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Casting Another form of Coercion is the explicit changing of one

data type to another for the purpose of a temporary calculation

For example in Cint x=5;

(float)x;

Alternatively in C++

float(x);

Page 13: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Example-2 Consider the program below

#include <iostream.h>

using namespace std;

void main(void)

{

int x,y,mean;

cout << "Enter 2 integers "<<endl;

cin >> x;

cin >> y;

mean = (x+y)/2;

cout "Mean Average is :"<<mean <<endl;

}

Page 14: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Program Output

Running again with different number gives us

3

3

Average is 3

4228250625

4228250625

Average is -66716672

Now we have gone over the size of a 4 byte integer so we get an overflow error to overcome this we modify the code thus

mean = (long(x)+y)/2;

Page 15: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

But what's wrong here

As the variable mean is an integer the value is rounded down, to overcome this problem we modify the code thus

inter two integers

3

2

Average is 2

float mean;

mean = (float(x)+y)/2;

Now the output looks like

inter two integers

3

2

Average is 2.5

Page 16: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Polymorphism by Parameter

Parametric Overloading allows us to have multiple methods of the same name with different parameters

We have already seen this with the constructor method in classes

For example we can have the following methods

aFunction(int value1);aFunction(int value1, int value2);aFunction(float value1);

Note that the return type of a function can not be overloaded and must remain the same value for every method.

Page 17: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Parametric Polymorphism (genericity)

The primary application of parametric polymorphism is in O-O systems to allow methods to work in a generic way.

However these functions are not truly generic as ad-hoc polymorphism is used

and each different parameter list has it’s own

implementation

In contrast a generic method will execute the same implementation but be able to accept a range of types as parameters

Page 18: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Parametric Polymorphism (genericity)

same function name function(...)

(int) (char) (char*) (double*) (floate*)

same implementation for each parameter type

Page 19: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Generic Functions (using templates)

In C++ genericity is is achieved by the use of templates

A template will operate on any data type for which the internal implementation is appropriate.

For example a template function which compares two objects using the ’>’ operator to return the greater will operate on any data type (including Objects) where the ’>’ function is appropriate.

From the operator overloading examples last week we can see that we can now also use a simple template function with objects.

Page 20: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

But why use templates I We often need to perform a similar process on different

data types

The data type(s) being processed are passed to a method as parameters

With parametric overloading, each type of parameter will cause the compiler to use a different (type specific) method.

With genericity, a single generic function is able to process all data types, including those defined by the programmer (i.e. objects) - all data types are handled by one (type generic) model.

Genericity allows us to create generic classes, as well as simply using generic functions as methods

Page 21: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Generic Functions Genericity is a more powerful tool than parametric

overloading for O-O systems because it does not have to anticipate the type of data parameters which may be supplied at run time.

This means it is able to handle dynamic objects of disparate types

However, this approach only works if we are able to process all data types in a particular way, this means that we need to have a common interface for all objects used as parameters

Page 22: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Generic function parameters

With generic functions parameters can be of any type

However they must be able to be processed by the function, which in this case means that able to use the ’==’ operator

This will also be true of any objects which use this function as they will need an overloaded ’==’ operator.

ISEQUAL(parameter1,parameter2)

ISEQUAL

parameter1 == parametr2

THRUE / FALSE

Page 23: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Template Functions Template functions are a generic functions which can have

parameters of any data type

The C++ syntax for creating a template function is as follows :template <class T> [return type] function(parameters)

template is a C++ keyword, and the name of the generic class name must be enclosed in pointed brackets <.....>

The class type name can be anything but most examples use T

This value T acts as an alias for any data type actually passed to the function (whether that data type is int, char, bank account banana etc)

Page 24: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

A simple Template example

//tgreater.htemplate <class T> bool isGreater(T x, T y){if(x>y) return true;else return false;}

The above code is saved in the header file tgreater.h so it can be included in the .cpp file as follows

Page 25: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

A simple Template example#include "tgreater.h"int main(void){int a=15, b=6;float aa=12.3, bb=34.53;char ca=’a’, cb=’z’;// function used with an intif (isGreater(a,b)) cout < <"a is greater than b"< <endl;else cout < <"b is greater than a"< <endl;//function used with a floatif (isGreater(aa,bb)) cout < <"aa is greater than bb"< <endl;else cout < <"bb is greater than aa"< <endl;// function used with a charif (isGreater(ca,cb)) cout < <"ca is greater than cb"< <endl;else cout < <"cb is greater than ca"< <endl; }

Page 26: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Template example//tgreater.htemplate <class T,class V> bool isGreater(T x, V y){if(x>y) return true;else return false;}

In the previous example the template function would only work for parameters of the same type, by modifying the type name parameters we can change the class to have different (or the same) data types.

Now we have two parameter types T and V

Page 27: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Testing 2 parameter template

int b=6;float aa=12.3;// function used with an intif (isGreater(aa,b)) cout < <"aa is greater than b"< <endl;else cout < <"b is greater than aa"< <endl;

Now we can use our generic function to test if an integer is greater than a floating point number.

Page 28: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

What happens when templates are used

As template functions are "generic" functions we do not know what data types are to be used until compile time

This means that the compiler has to expand the template function for every data type to be used and create separate type specific functions for each use.

For the previous example the compiler would generate 3 different functions one for int one for float and one for char data types

Page 29: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

What happens when templates are used

This means that at compile time if templates are used compilation will be slower as the compiler has to expand the templates into real functions

As there is no checking until compilation time for template we do not know whether they will work until the compiler has expanded them. This can lead to error especially when we are using classes as parameters to templates

Page 30: Polymorphism Lecture-10. Print A Cheque A Report A Photograph PrintCheque() PrintReport() PrintPhoto() Printing

Template advantages / disadvantages Defining generic classes that are “parametrised” with types

i.e. classes can have types as arguments.

A template parameter representing a “type variable” is denoted as class identifier

Template arguments are type names that match “type variable” parameters

A powerful way of defining families of similar classes.

Pre-processing of templates expands into a full class specification for every different combination of template arguments. This increases the source code size as well as compilation time.