OOP Fundamental Concepts

Similar documents
POLYMORPHISM Polymorphism: the type Polymorphism taking many shapes type of object

Polymorphism 8. Polymorphism. Content. Normal Member Functions Accessed with Pointers. Polymorphism. Virtual Members Abstract Class

What is Polymorphism? Quotes from Deitel & Deitel s. Why polymorphism? How? How? Polymorphism Part 1

Polymorphism Part 1 1

15: Polymorphism & Virtual Functions

C++ Crash Kurs. Polymorphism. Dr. Dennis Pfisterer Institut für Telematik, Universität zu Lübeck

OOP THROUGH C++(R16) int *x; float *f; char *c;

Polymorphism. Zimmer CSCI 330

Polymorphism. Miri Ben-Nissan (Kopel) Miri Kopel, Bar-Ilan University

CS32 - Week 4. Umut Oztok. Jul 15, Umut Oztok CS32 - Week 4

OBJECT ORIENTED PROGRAMMING USING C++ CSCI Object Oriented Analysis and Design By Manali Torpe

QUIZ. Write the following for the class Bar: Default constructor Constructor Copy-constructor Overloaded assignment oper. Is a destructor needed?

Object-Oriented Programming, Iouliia Skliarova

Programming, numerics and optimization

cout << "How many numbers would you like to type? "; cin >> memsize; p = new int[memsize];

C How to Program, 6/e by Pearson Education, Inc. All Rights Reserved.

Framework Fundamentals

Introduction to C++ Introduction to C++ Dr Alex Martin 2013 Slide 1

Inheritance, and Polymorphism.

Chapter 15. Polymorphism and Virtual Functions. Copyright 2010 Pearson Addison-Wesley. All rights reserved

POLYMORPHISM 2 PART. Shared Interface. Discussions. Abstract Base Classes. Abstract Base Classes and Pure Virtual Methods EXAMPLE

POLYMORPHISM 2 PART Abstract Classes Static and Dynamic Casting Common Programming Errors

CS105 C++ Lecture 7. More on Classes, Inheritance

Java Object Oriented Design. CSC207 Fall 2014

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur


Object-Oriented Programming

University of Swaziland Department OfComputer Science Main Examination December 2016

OOPS Viva Questions. Object is termed as an instance of a class, and it has its own state, behavior and identity.

What are the characteristics of Object Oriented programming language?

POLYMORPHISM. Phone : (02668) , URL :

(12-1) OOP: Polymorphism in C++ D & D Chapter 12. Instructor - Andrew S. O Fallon CptS 122 (April 3, 2019) Washington State University

CS 162, Lecture 25: Exam II Review. 30 May 2018

C++ Programming: Polymorphism

Object Oriented Software Design II

Inheritance. OOP components. Another Example. Is a Vs Has a. Virtual Destructor rule. Virtual Functions 4/13/2017

Object Oriented Software Design II

Fast Introduction to Object Oriented Programming and C++

Software Paradigms (Lesson 3) Object-Oriented Paradigm (2)

ECE 3574: Dynamic Polymorphism using Inheritance

CS24 Week 3 Lecture 1

Note 12/1/ Review of Inheritance Practice: Please write down 10 most important facts you know about inheritance...

Inheritance, Polymorphism, and Interfaces

Syllabus of C++ Software for Hands-on Learning: This course offers the following modules: Module 1: Getting Started with C++ Programming

8. Functions (II) Control Structures: Arguments passed by value and by reference int x=5, y=3, z; z = addition ( x, y );

Cpt S 122 Data Structures. Course Review Midterm Exam # 2

1: Introduction to Object (1)

C++ Inheritance and Encapsulation

Data type of a pointer must be same as the data type of the variable to which the pointer variable is pointing. Here are a few examples:

Short Notes of CS201

04-24/26 Discussion Notes

1. Write two major differences between Object-oriented programming and procedural programming?

Increases Program Structure which results in greater reliability. Polymorphism

CIS 190: C/C++ Programming. Lecture 11 Polymorphism

CS201 - Introduction to Programming Glossary By

Object-Oriented Programming (OOP) Fundamental Principles of OOP

Data Structures using OOP C++ Lecture 3

Object-Oriented Concept

CS304- Object Oriented Programming LATEST SOLVED MCQS FROM FINALTERM PAPERS. MC

Object Oriented Programming: Inheritance Polymorphism

Data Structures and Other Objects Using C++

VIRTUAL FUNCTIONS Chapter 10

Chapter 1: Object-Oriented Programming Using C++

Initializing and Finalizing Objects

KLiC C++ Programming. (KLiC Certificate in C++ Programming)

CISC 2200 Data Structure Fall, C++ Review:3/3. 1 From last lecture:

Inheritance 6. Content. Inheritance. Reusability in Object-Oriented Programming. Inheritance

COEN244: Class & function templates

CS11 Introduction to C++ Fall Lecture 7

Content. Inheritance 6. Object Oriented Programming

Introduction to Design Patterns

Virtual functions concepts

Why use inheritance? The most important slide of the lecture. Programming in C++ Reasons for Inheritance (revision) Inheritance in C++

Object Oriented Programming. Solved MCQs - Part 2

CS250 Intro to CS II. Spring CS250 - Intro to CS II 1

Ch. 11: References & the Copy-Constructor. - continued -

Object-Oriented Programming, Iouliia Skliarova

PROGRAMMING IN C++ COURSE CONTENT

OBJECT ORIENTED PROGRAMMING. Ms. Ajeta Nandal C.R.Polytechnic,Rohtak

Pointers II. Class 31

Classes - 2. Data Processing Course, I. Hrivnacova, IPN Orsay

Object Oriented Programming in C++ Basics of OOP

CS250 Final Review Questions

Pointer Basics. Lecture 13 COP 3014 Spring March 28, 2018

CSCI 102 Fall 2010 Exam #1

Java Class Design. Eugeny Berkunsky, Computer Science dept., National University of Shipbuilding

Programming C++ Lecture 3. Howest, Fall 2012 Instructor: Dr. Jennifer B. Sartor

Object Orientated Analysis and Design. Benjamin Kenwright

QUIZ. What is wrong with this code that uses default arguments?

Lesson Plan. Subject: OBJECT ORIENTED PROGRAMMING USING C++ :15 weeks (From January, 2018 to April,2018)

Operator overloading


Lecture 11. Demonstration #1. More Inheritance, More Constructors. Absolute C++ Chapter 15. Virtual Functions. Overriding

Composition I. composition is a way to combine or compose multiple classes together to create new class

C++ (classes) Hwansoo Han

EECS 211 Lab 6. Classes and Abstractation Winter Getting the code. Encapsulation and Abstraction. Classes

G52CPP C++ Programming Lecture 13

VALLIAMMAI ENGINEERING COLLEGE

Object-oriented programming. and data-structures CS/ENGRD 2110 SUMMER 2018

CSc 520. Principles of Programming Languages 45: OO Languages Introduction

Transcription:

Polymorphism Dr. Sanem Sarıel Talay 1 OOP Fundamental Concepts 1. Encapsulation (Classes) Data abstraction, information hiding 2. Inheritance Is a relation, reusability 3. Polymorphism Run time decision for function calls (dynamic method binding) 1

Polymorphism introduction In real life, there is often a collection of different objects that, given identical instructions (messages), should take different actions. Take teacher and principal, for example. Suppose the minister of education wants to send a directive to all personnel: Print your personal information!. Different kinds of staff (teacher or principal) have to print different information. But the minister doesn t need to send a different message to each group. One message works for everyone because everyone knows how to print his or her personal information. Besides the minister don t need to know the type of the person to whom the message is to be sent. Polymorphism introduction, con t Polymorphism means taking many shapes. The minister s single instruction is polymorphic because it looks different to different kinds of personnel. The minister don t need to know the type of the person to whom she/he the message sends. Typically, polymorphism occurs in classes that are related by inheritance. In C++, polymorphism means that a call to a member function will cause a different function to be executed depending on the type of object that gets the message. The sender of the message don t need to know the type of the receiving object. This sounds a little like function overloading, but polymorphism is a different, and much more powerful, mechanism. One difference between overloading and polymorphism has to do with which function to execute when the choice is made. With function overloading, the choice is made by the compiler (compile time). With polymorphism, it s made while the program is running (run time). 2

Member functions accessed w/ pointers The first example shows what happens when base and derived classes all have functions with the same name and these functions are accessed using pointers but without using virtual functions (without polymorphism). class Teacher{ // Base class string name; int numofstudents; Teacher(const string &, int); // Constructor of base void print() const; ; class Principal : public Teacher{ // Derived class string SchoolName; Principal(const string &, int, const string &); void print() const; ; Both classes have a function with the same name: print. But in this example these functions are not virtual (not polymorphic). Member functions accessed w/ pointers // Show is a system that operates on Teachers and Principals void show (const Teacher * tp){ tp->print(); // which print // Only to test the show function int main(){ Teacher t1("teacher 1", 50); Principal p1("principal 1", 40, "School"); Teacher *ptr; char c; cout << "Teacher or Principal " ; cin >> c; if (c == 't') ptr = &t1; else ptr = &p1; show(ptr); // which print?? : See Example: e81.cpp The Principal class is derived from class Teacher. Both classes have a member function with the same name print(). In main(), the program defines a pointer to class Teacher. The main program sometimes puts the address of the Teacher object and sometimes the address of a derived class object (Principal) in the base class pointer as in the line ptr = &p1; Remember that it s all right to assign an address of derived type to a pointer of the base. This address is sent to the function show() over a pointer to base. 3

Member functions accessed w/ pointers Now the question is, when you execute the statement tp->print(); which function is called? Isit Teacher::print() or Principal::print()? Answer is: The function in the base class (Teacher) is executed in both cases. The compiler ignores the contents of the pointer ptr and chooses the member function that matches the type of the pointer. Virtual member functions Let s make a single change in the program: Place the keyword virtual in front of the declaration of the print() function in the base class. class Teacher{ // Base class string name; int numofstudents; Teacher(const string &, int); // Constructor of base virtual void print() const;// A virtual (polymorphic) function ; class Principal : public Teacher{ // Derived class string SchoolName; Principal(const string &, int, const string &); void print() const; // It is also virtual (polymorphic) ; See Example: e82.cpp 4

Virtual member functions Now, different functions are executed, depending on the contents of ptr, not on the type. This is polymorphism at work. I ve made print() polymorphic by designating it virtual. Benefits of Polymorphism Polymorphism provides flexibility. In our example the show() function has no information about the type of object pointed by the input parameter. It can have the address of an object of any class derived from the Teacher class. So this function can operate on any class derived from the Teacher. If we add a new teacher type (a new class) to the system, for example InternTeacher, we do not need to change the show function. The same thing is true, if we discard a class derived from Teacher from the system. 5

UML diagram of the design sample Pointer tp in Show can point to objects of Teacher and to objects of all classes derived from Teacher. Show tp Teacher print() Inheritance Principal print() InternTeacher print() Polymorphism also works for references Note that, in C++ it is preferred to use references instead of pointers by passing parameters. The same program can be written as follows: // Show is a system that operates on Teachers and Principals void show (const Teacher & tp){ tp.print(); // which print // Only to test the show function int main(){ Teacher t1("teacher 1", 50); Principal p1("principal 1", 40, "School"); char c; cout << "Teacher or Principal " ; cin >> c; if (c == 't') show(t1); else show(p1); : 6

Polymorphism works for object references Be aware that the virtual function mechanism works only with pointers to objects and, with references, not with objects themselves. int main(){ Teacher t1("teacher 1", 50); Principal p1("principal 1", 40, "School"); t1.print(); // not polymorphic p1.print(); // not polymorphic return 0; Calling virtual functions is a time consuming process, because of indirect call via tables. Don t declare functions as virtual if it is not necessary. Linked list of objects and polymorphism The most common ways to use virtual functions are with an array of pointers to objects and linked lists of objects. Examine the example: See Example: e83.cpp Remember, there is a list class in the standard library of the C++. You don t need to write a class to define linked lists. 7

Late binding How does the compiler know what function to compile? In e81.cpp, without polymorphism, the compiler has no problem with the expression tp->print(); It always compiles a call to the print() function in the base class. But in e82.cpp, the compiler doesn t know what class the contents of tp may be a pointer to. It could be the address of an object of the Teacher class or the Principal class. Which version of print() does the compiler call? In fact, at the time it s compiling the program, the compiler doesn t know which function to call. So instead of a simple function call, it places a piece of code there. At runtime, when the function call is executed, code that the compiler placed in the program finds out the type of the object whose address is in tp and calls the appropriate print() function: Teacher::print() or Principal::print(). Selecting a function at runtime is calledlatebinding late or dynamic binding. (Binding means connecting the function call to the function.) Connecting to functions in the normal way, during compilation, is called early binding or static binding. Late binding requires a small amount of overhead (the call to the function might take something like 10 percent longer) but provides an enormous increase in power and flexibility. Virtual function tables Remember that, stored in memory, a normal object that is, one with no virtual functions contains only its own data, nothing else. When a member function is called for such an object, the address of the object is available in the this pointer, which the member function uses (usually invisibly) to access the object s data. The address in this is generated by the compiler every time a member function is called; it s not stored in the object. With virtual functions, things are more complicated. When a derived class with virtual functions is specified, the compiler creates a table an array of function addresses called the virtual table. In the example e82.cpp, the Teacher and Principal classes each have their own virtual table. There is an entry in each virtual table for every virtual function in the class. Objects of classes with virtual functions contain a pointer to the virtual table (vptr) of the class. These objects are slightly larger than normal objects. In the example, when a virtual function is called for an object of Teacher or Principal, the compiler, instead of specifying what function will be called, creates code that will first look at the object s virtual table and then uses this to access the appropriate member function address. Thus, for virtual functions, the object itself determines what function is called, rather than the compiler. 8

Virtual function tables, con t Example: Assume that the classes Teacher and Principal contain two virtual functions. class Teacher{ // Base class string name; int numofstudents; t virtual void read(); // Virtual function virtual void print() const; // Virtual function ; class Principal : public Teacher{ // Derived class string SchoolName; void read(); // Virtual function void print() const; // Virtual function ; Virtual Table of Teacher Virtual Table of Principal &Teacher::read &Teacher::print &Principal::read &Principal::print Virtual function tables, con t Objects of Teacher and Principal will contain a pointer to their virtual tables. int main(){ Teacher t1("teacher 1", 50); Teacher t2("teacher 2", 35); Virtual Table of Teacher Principal p1("principal 1", 45, "School 1"); : MC68000 like assembly counterpart t1 of the statement ptr->print(); Here ptr contains the address of an object. vptr Teacher 1 50 &Teacher::read &Teacher::print move.l ptr, this ; this to object movea.l ptr, a0 ; a0 to object movea.l (a0), a1 ; a1<-vptr jsr 4(a1) ; jsr print t2 If the print() function would not a virtual function: move.l ptr, this ; this to object jsr teacher_print or jsr principal_print p1 vptr Teacher 2 35 vptr Principal 1 45 School 1 Virtual Table of Principal &Principal::read &Principal::print 9

Abstract Classes When creating objects from a base class is not needed, the class is declared as abstract. Example: A factory can make a sports car or a truck or an ambulance, but it can t make a generic vehicle. The factory must know the details about what kind of vehicle to make before it can actually make one. Similarly, l you ll see sparrows, wrens, and robins flying around, but you won t see any generic birds. How to make abstract classes When at least one of the methods are declares as pure virtual function, then the class becomesan absract class. A pure virtual function is a virtual function with no body. The body of the virtual function in the base class is removed, and the notation =0 is added to the function declaration. 10

Abstract Class Example class GenericShape{ // Abstract base class protected: int x, y; GenericShape(int x_in, int y_in){ x = x_in; y = y_in; //Constructor virtual void draw() const =0; // pure virtual function ; class Line:public GenericShape{ // Line class protected: int x2,y2; // End coordinates of line Line(int x_in,int y_in,int x2_in,int y2_in):genericshape(x_in,y_in), x2(x2 _ in),y2(y2 _ in) { void draw()const; // virtual draw function ; void Line::draw()const{ cout << "Type: Line" << endl; cout << "Coordinates of end points: " << "X1=" << x << ",Y1=" << y << ",X2=" << x2 << ",Y2=" << y2 << endl; Abstract Class Example, con t class Rectangle:public GenericShape{ // Rectangle class protected: int x2,y2; // coordinates of 2nd corner point Rectangle(int x_in,int y_in,int x2_in,int y2_in): GenericShape(x_in,y_in), x2(x2_in),y2(y2_in) { void draw()const; // virtual draw ; void Rectangle::draw()const { cout << "Type: Rectangle" << endl; cout << "Coordinates of corner points: " << "X1=" << x << ",Y1=" << y << ",X2=" << x2 << ",Y2=" << y2 << endl; class Circle:public GenericShape{ // Circle class protected: int radius; Circle(int x_cen,int y_cen,int r):genericshape(x_cen,y_cen), radius(r) { void draw() const; // virtual draw ; 11

Abstract Class Example, con t void Circle::draw()const{ cout << "Type: Circle" << endl; cout << "Coordinates of center point: " << "X=" << x << ",Y=" << y << endl; cout << "Radius: " << radius << endl; // A function to draw different shapes void show(const Generic_shape &shape){//can take references to different shapes, Which draw function will be called? shape.draw(); // It 's unknown at compile-time int main(){ // A main function to test the system Line line1(1, 1, 100, 250); Circle circle1(100, 100, 20); Rectangle rectangle1(30, 50, 250, 140); Circle circle2(300, 170, 50); show(circle1); // show function can take different shapes as argument show(line1); show(circle2); See Example: e84a.cpp show(rectangle1); return 0; Abstract Class Example, UML Diagram Show shape GenericShape draw() Virtual class (italic) Pure virtual Function (italic) Line draw() Rectangle draw() Circle draw() Arc draw() 12

Abstract Class Example, con t If we write a class for a new shape by deriving it from an existing class, we don t need to modify the show function. This function can also show the new shape. For example we can add an Arc class to our graphics library, which will not effect the show function. class Arc:public Circle{ // Arc class protected: int sa, ea; // Start and end angles Arc(int x_cen,int y_cen,int r, int a1, int a2):circle(x_cen,y_cen,r), sa(a1),ea(a2) { void draw() const; // virtual draw ; See Example: e84b.cpp void Arc::draw()const{ cout << "Type: Arc" << endl; cout << "Coordinates of center point: " << "X=" << x << ",Y=" << y << endl; cout << "Radius: " << radius << endl; cout << "Start and end angles: " << "SA=" << sa << ",EA=" << ea << endl; Virtual Constructors Can constructors be virtual? No, they can t be. When you re creating an object, you usually already know what kind of object you re creating and can specify this to the compiler. Thus, there s not a need for virtual constructors. Also, an object s constructor sets up its virtual mechanism (the virtual table) in the first place. You don t see the code for this, of course, just as you don t see the code that allocates memory for an object. Virtual functions can t even exist until the constructor has finished its job, so constructors can t be virtual. 13

Virtual Destructors Recall that a derived class object typically contains data from both the base class and the derived class. To ensure that such data is properly disposed of, it may be essential that destructors for both base and derived classes are called. But the output of e85.cpp is Base Destructor Program terminates See Example: e85.cpp In this program bp is a pointer of Base type. So it can point to objects of Base type and Derived type. In the example, bp points to an object of Derived class, but while deleting the pointer only the Base class destructor is called. This is the same problem you saw before with ordinary (nondestructor) functions. If a function isn t virtual, only the base class version of the function will be called when it s invoked using a base class pointer, even if the contents of the pointer is the address of a derived class object. Thus in e85.cpp, the Derived class destructor is never called. This could be a problem if this destructor did something important. To fix this problem, we have to make the base class destructor virtual. 14