OOP, Inheritance and Polymorphism Lecture 6. Object relations Inheritance is ‘a kind of’, ‘a…
Polymorphism+ oop+ lecture28
-
Upload
abdul-waqar -
Category
Education
-
view
410 -
download
4
description
Transcript of Polymorphism+ oop+ lecture28
![Page 1: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/1.jpg)
Object-Oriented Programming (OOP)
Lecture No. 28
![Page 2: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/2.jpg)
Problem Statement
• Develop a function that can draw different types of geometric shapes from an array
![Page 3: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/3.jpg)
Shape Hierarchy
Shape
Line Circle Triangle
drawcalcArea
drawcalcArea
drawcalcArea
drawcalcArea
![Page 4: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/4.jpg)
Shape Hierarchy
class Shape {…
protected:char _type;
public:Shape() { }void draw(){ cout << “Shape\n”; }int calcArea() { return 0; }char getType() { return _type; }
}
![Page 5: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/5.jpg)
… Shape Hierarchy
class Line : public Shape {
…
public:
Line(Point p1, Point p2) {
…
}
void draw(){ cout << “Line\n”; }
}
![Page 6: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/6.jpg)
… Shape Hierarchy
class Circle : public Shape {…
public:Circle(Point center, double radius) {
…}void draw(){ cout << “Circle\n”; }int calcArea() { … }
}
![Page 7: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/7.jpg)
… Shape Hierarchy
class Triangle : public Shape {…
public:Triangle(Line l1, Line l2,
double angle){ … }void draw(){ cout << “Triangle\n”; }int calcArea() { … }
}
![Page 8: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/8.jpg)
Drawing a Scene
int main() {Shape* _shape[ 10 ];Point p1(0, 0), p2(10, 10);shape[1] = new Line(p1, p2);shape[2] = new Circle(p1, 15);…void drawShapes( shape, 10 );return 0;
}
![Page 9: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/9.jpg)
Function drawShapes()
void drawShapes(Shape* _shape[], int size) {
for (int i = 0; i < size; i++) {
_shape[i]->draw();}
}
![Page 10: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/10.jpg)
Sample Output
Shape
Shape
Shape
Shape
…
![Page 11: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/11.jpg)
Function drawShapes()
void drawShapes(
Shape* _shape[], int size) {
for (int i = 0; i < size; i++) {
// Determine object type with
// switch & accordingly call
// draw() method
}
}
![Page 12: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/12.jpg)
Required Switch Logic
switch ( _shape[i]->getType() ){case ‘L’:
static_cast<Line*>(_shape[i])->draw();
break;case ‘C’:static_cast<Circle*>(_shape[i])
->draw();break;
…}
![Page 13: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/13.jpg)
Equivalent If Logic
if ( _shape[i]->getType() == ‘L’ )static_cast<Line*>(_shape[i])->draw();
else if ( _shape[i]->getType() == ‘C’ ) static_cast<Circle*>(_shape[i])->draw();
…
![Page 14: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/14.jpg)
Sample Output
Line
Circle
Triangle
Circle
…
![Page 15: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/15.jpg)
Problems with Switch Statement
![Page 16: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/16.jpg)
…Delocalized Code
• Consider a function that prints area of each shape from an input array
![Page 17: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/17.jpg)
Function printArea
void printArea(Shape* _shape[], int size) {for (int i = 0; i < size; i++) {
// Print shape name.// Determine object type with// switch & accordingly call// calcArea() method.
}}
![Page 18: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/18.jpg)
Required Switch Logic
switch ( _shape[i]->getType() ){case ‘L’:
static_cast<Line*>(_shape[i])->calcArea(); break;
case ‘C’:static_cast<Circle*>(_shape[i])
->calcArea(); break;…
}
![Page 19: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/19.jpg)
…Delocalized Code
• The above switch logic is same as was in function drawArray()
• Further we may need to draw shapes or calculate area at more than one places in code
![Page 20: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/20.jpg)
Other Problems
• Programmer may forget a check
• May forget to test all the possible cases
• Hard to maintain
![Page 21: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/21.jpg)
Solution?
• To avoid switch, we need a mechanism that can select the message target automatically!
![Page 22: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/22.jpg)
Polymorphism Revisited
• In OO model, polymorphism means that different objects can behave in different ways for the same message (stimulus)
• Consequently, sender of a message does not need to know the exact class of receiver
![Page 23: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/23.jpg)
Virtual Functions• Target of a virtual function call is
determined at run-time
• In C++, we declare a function virtual by preceding the function header with keyword “virtual”
class Shape {…virtual void draw();
}
![Page 24: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/24.jpg)
Shape Hierarchy
Shape
Line Circle Triangle
drawcalcArea
drawcalcArea
drawcalcArea
drawcalcArea
![Page 25: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/25.jpg)
…Shape Hierarchy Revisited
class Shape {…virtual void draw();virtual int calcArea();
}class Line : public Shape {…virtual void draw();
}
No type field
![Page 26: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/26.jpg)
… Shape Hierarchy Revisited
class Circle : public Shape {…virtual void draw();virtual int calcArea();
}class Triangle : public Shape {…virtual void draw();virtual int calcArea();
}
![Page 27: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/27.jpg)
Function drawShapes()
void drawShapes(Shape* _shape[], int size) {
for (int i = 0; i < size; i++) {
_shape[i]->draw();
}
}
![Page 28: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/28.jpg)
Sample Output
Line
Circle
Triangle
Circle
…
![Page 29: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/29.jpg)
Function printArea
void printArea(Shape* _shape[], int size) {
for (int i = 0; i < size; i++) {
// Print shape namecout<< _shape[i]
->calcArea();cout << endl;
}}
![Page 30: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/30.jpg)
Static vs Dynamic Binding
• Static binding means that target function for a call is selected at compile time
• Dynamic binding means that target function for a call is selected at run time
![Page 31: Polymorphism+ oop+ lecture28](https://reader033.fdocuments.net/reader033/viewer/2022061206/5481ba7fb4af9f70638b4aec/html5/thumbnails/31.jpg)
Static vs Dynamic Binding
Line _line;_line.draw(); // Always Line::draw
// calledShape* _shape = new Line();_shape->draw(); // Shape::draw called
// if draw() is not virtual
Shape* _shape = new Line();_shape->draw(); // Line::draw called
// if draw() is virtual