Polymorphism &Virtual Functions

Slides:



Advertisements
Similar presentations
CPA: C++ Polymorphism Copyright © 2007 Mohamed Iqbal Pallipurath Overview of C++ Polymorphism Two main kinds of types in C++: native and user-defined –User-defined.
Advertisements

V IRTUAL F UNCTIONS Chapter 10 Department of CSE, BUET 1.
Virtual Functions Junaed Sattar November 10, 2008 Lecture 10.
Shallow Versus Deep Copy and Pointers Shallow copy: when two or more pointers of the same types point to the same memory – They point to the same data.
Lecture 6: Polymorphism - The fourth pillar of OOP - 1.
Computer Science and Software Engineering University of Wisconsin - Platteville 7. Inheritance and Polymorphism Yan Shi CS/SE 2630 Lecture Notes.
Chapter 4 Inheritance Bernard Chen Spring Objective IS-A relationships and the allowable changes for derived classes The concept of polymorphism.
Pointer Data Type and Pointer Variables
Inheritance in C++ CS-1030 Dr. Mark L. Hornick.
Learners Support Publications Pointers, Virtual Functions and Polymorphism.
CSE 425: Object-Oriented Programming II Implementation of OO Languages Efficient use of instructions and program storage –E.g., a C++ object is stored.
1 Classes- Inheritance Multiple Inheritance It is possible to derive a new class from more than one base class. This is called Multiple Inheritance. Under.
Chapter 15 – Inheritance, Virtual Functions, and Polymorphism
Polymorphism. Introduction ‘one name multiple forms’ Implemented using overloaded functions and operators Early binding or static binding or static linking.
Polymorphism &Virtual Functions
Polymorphism &Virtual Functions 1. Polymorphism in C++ 2 types ▫Compile time polymorphism  Uses static or early binding  Example: Function and operator.
Object-Oriented Programming: Polymorphism 1. OBJECTIVES What polymorphism is, how it makes programming more convenient, and how it makes systems more.
1 Inheritance We are modeling the operation of a transportation company that uses trains and trucks to transfer goods. A suitable class hierarchy for the.
Object Oriented Programming with C++/ Session 6 / 1 of 44 Multiple Inheritance and Polymorphism Session 6.
Unit IV Unit IV: Virtual functions concepts, Abstracts classes & pure virtual functions. Virtual base classes, Friend functions, Static functions, Assignment.
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes.
Polymorphism and Virtual Functions. Topics Polymorphism Virtual Functions Pure Virtual Functions Abstract Base Classes Virtual Destructors V-Tables Run.
Copyright 2006 Oxford Consulting, Ltd1 February Polymorphism Polymorphism Polymorphism is a major strength of an object centered paradigm Same.
Object-Oriented Programming in C++ More examples of Association.
C/C++ 3 Yeting Ge. Static variables Static variables is stored in the static storage. Static variable will be initialized once. 29.cpp 21.cpp.
Chapter 9 Questions 1. What are the difference between constructors and member functions? 2. Design and implement a simple class as you want, with constructors.
CS212: Object Oriented Analysis and Design Lecture 17: Virtual Functions.
CS-1030 Dr. Mark L. Hornick 1 Basic C++ State the difference between a function/class declaration and a function/class definition. Explain the purpose.
Chapter -6 Polymorphism
Overview of C++ Polymorphism
Fall 2015CISC/CMPE320 - Prof. McLeod1 CISC/CMPE320 Assignment 3 is due Sunday, the 8 th at 7pm. Problems with assn 3? Discuss at your team meeting tonight.
Recap Introduction to Inheritance Inheritance in C++ IS-A Relationship Polymorphism in Inheritance Classes in Inheritance Visibility Rules Constructor.
Polymorphism and Virtual Functions One name many shapes behaviour Unit - 07.
Class Inheritance Inheritance as an is-a relationship Public derive one class from another Protected access Initializer lists in constructor Upcasting.
Inheritance - 3. Virtual Functions Functions defined as virtual are ones that the base expects its derived classes may redefine. Functions defined as.
Computer Science Department Inheritance & Polymorphism.
1 Inheritance and Polymorphism Chapter Getting Started Continue the Cat Management example from previous presentation.
Polymorphism & Virtual Functions 1. Objectives 2  Polymorphism in C++  Pointers to derived classes  Important point on inheritance  Introduction to.
 Virtual Function Concepts: Abstract Classes & Pure Virtual Functions, Virtual Base classes, Friend functions, Static Functions, Assignment & copy initialization,
CS1201: Programming Language 2 Classes and objects Inheritance Nouf Aljaffan Edited by : Nouf Almunyif.
Inheritance Modern object-oriented (OO) programming languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design,
CMSC 202 Polymorphism.
Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes
CS 3370 – C++ Object-oriented Programming
7. Inheritance and Polymorphism
Class A { public : Int x; A()
Object-Oriented Programming
Polymorphism.
CS212: Object Oriented Analysis and Design
Inheritance & Polymorphism
Polymorphism & Virtual Functions
Polymorphism Lec
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes
Learning Objectives Inheritance Virtual Function.
Virtual Functions Department of CSE, BUET Chapter 10.
Inheritance Virtual Functions, Dynamic Binding, and Polymorphism
Polymorphism Polymorphism
Programming II Polymorphism A.AlOsaimi.
Pointers Dr. Bhargavi Goswami Department of Computer Science
Polymorphism CMSC 202, Version 4/02.
Virtual Functions Polymorphism is supported by C++ both at compile time and at run time. Compile-time polymorphism is achieved by overloading functions.
Inheritance Virtual Functions, Dynamic Binding, and Polymorphism
Today’s Objectives 10-Jul-2006 Announcements Quiz #3
Overview of C++ Polymorphism
VIRTUAL FUNCTIONS RITIKA SHARMA.
Inheriting Multiple Base Classes
C++ Polymorphism Reference and pointer implicit type casting
Lecture 6: Polymorphism
Static Binding Static binding chooses the function in the class of the base class pointer, ignoring any versions in the class of the object actually.
Computer Science II for Majors
Presentation transcript:

Polymorphism &Virtual Functions

Polymorphism in C++ 2 types Compile time polymorphism Uses static or early binding Example: Function and operator overloading Run time polymorphism Uses dynamic or Late binding Example: Virtual functions

Pointers to Derived Classes C++ allows base class pointers to point to derived class objects. Let we have – class B_Class{ … }; class D_Class: public B_Class{ … }; Then we can write – B_Class *p1; // pointer to object of type B_Class D_Class d_obj; // object of type D_Class Both statement are valid: p1 = &d_obj; B_Class *p2 = new D_Class;

Pointers to Derived Classes (contd.) Using a base class pointer (pointing to a derived class object) we can access only those members of the derived object that were inherited from the base. This is because the base pointer has knowledge only of the base class. It knows nothing about the members added by the derived class.

Pointers to Derived Classes (contd.) #include <iostream> using namespace std; class base { public: void show() { cout << “show base"<<endl; } }; ///////////////////// class derived : public base { void show() { cout << “show derived"<<endl; } void main() { base b1; b1.show(); derived d1; d1.show(); base *ptrb; ptrb = &b1; ptrb->show(); ptrb = &d1; } All the function calls here are statically bound

Pointers to Derived Classes (contd.)

Pointers to Derived Classes (contd.) While it is permissible for a base class pointer to point to a derived object, the reverse is not true. base b1; derived *pd = &b1; // compiler error We can perform a downcast with the help of type-casting, but should use it with caution (see next slide).

Pointers to Derived Classes (contd.) Let we have – class base { }; class derived : public base { }; class xyz { }; // having no relation with “base” or “derived”

Pointers to Derived Classes (contd.) Then if we write – base objb, *ptrb; derived objd; ptrb = &objd; // ok derived *ptrd; ptrd = ptrb ;// compiler error ptrd = (derived *)ptrb; // ok, valid down casting xyz obj;// ok ptrd = (derived *)&obj; // invalid casting, no compiler error, but may cause run-time error ptrd = (derived *)&objb; // invalid casting, no compiler error, but may cause run-time error }

Pointers to Derived Classes (contd.) In fact using type-casting, we can use pointer of any class to point to an object of any other class. The compiler will not complain. During run-time, the address assignment will also succeed. But if we use the pointer to access any member, then it may cause run-time error.

Pointers to Derived Classes (contd.) Pointer arithmetic is relative to the data type the pointer is declared as pointing to. If we point a base pointer to a derived object and then increment the pointer, it will not be pointing to the next derived object. It will be pointing to (what it thinks is) the next base object !!! Be careful about this.

Important Point on Inheritance In C++, only public inheritance supports the perfect IS-A relationship. In case of private and protected inheritance, we cannot treat a derived class object in the same way as a base class object Public members of the base class becomes private or protected in the derived class and hence cannot be accessed directly by others using derived class objects If we use private or protected inheritance, we cannot assign the address of a derived class object to a base class pointer directly. We can use type-casting, but it makes the program logic and structure complicated.

Introduction to Virtual Functions A virtual function is a member function that is declared within a base class and redefined (called overriding) by a derived class. It implements the “one interface, multiple methods” philosophy that underlies polymorphism. The keyword virtual is used to designate a member function as virtual. Supports run-time polymorphism with the help of base class pointers.

Introduction to Virtual Functions (contd.) While redefining a virtual function in a derived class, the function signature must match the original function present in the base class .So, we call it overriding, not overloading. When a virtual function is redefined by a derived class, the keyword virtual is not needed (but can be specified if the programmer wants). The “virtual”-ity of the member function continues along the inheritance chain. A class that contains a virtual function is referred to as a polymorphic class.

Introduction to Virtual Functions (contd.) #include <iostream> using namespace std; class base { public: virtual void show() { cout << “show base"<<endl; } }; ///////////////////// class derived : public base { void show() { cout << “show derived"<<endl; } void main() { base b1; b1.show(); derived d1; d1.show(); base *ptrb; ptrb = &b1; ptrb->show(); ptrb = &d1; }

Introduction to Virtual Functions (contd.)

Introduction to Virtual Functions (contd.) void main() { base *ptrb; derived1 objd1; derived2 objd2; int n; cout<<" enter a number"<<endl; cin >> n; if (n ==1) ptrb = &objd1; else ptrb = &objd2; ptrb->show(); // guess what ?? } #include <iostream> using namespace std; class base { public: virtual void show() { cout << "show base"<<endl; }}; ///////////////////// class derived1 : public base { void show() { cout << "show derived 1"<<endl; }}; class derived2 : public base { void show() { cout << "show derived 2"<<endl; }}; Run-time polymorphism

Introduction to Virtual Functions (contd.)

Virtual Destructors Constructors cannot be virtual, but destructors can be virtual. It ensures that the derived class destructor is called when a base class pointer is used while deleting a dynamically created derived class object.

Virtual Destructors (contd.) Using non-virtual destructor #include <iostream> using namespace std; class base { public: ~base() { cout << "destructing base"<<endl; }}; class derived : public base { ~derived() {cout << "destructing derived"<<endl; }}; void main() { base *p = new derived; delete p; }

Using non-virtual destructor

Virtual Destructors (contd.) Using virtual destructor #include <iostream> using namespace std; class base { public: virtual ~base() { cout << "destructing base"<<endl; }}; class derived : public base { ~derived() {cout << "destructing derived"<<endl; }}; void main() { base *p = new derived; delete p; }

Virtual Destructors (contd.) Using virtual destructor

Virtual functions are inherited Once function is declared as virtual, it stays virtual no matter how many layers of derived classes it may pass through. //derived from derived, not base

Virtual functions are inherited void main() { base b1; derived1 d1; derived2 d2; base *pb = &b1; pb->show(); pb = &d1; pb = &d2; } What if there is show in derived 2 ? #include <iostream> using namespace std; class base { public: virtual void show() { cout << "show base"<<endl; }}; ///////////////////// class derived1 : public base { void show() { cout << "show derived 1"<<endl; }}; class derived2 : public derived1 {};

Virtual functions are inherited

Simple App of virtual function class figure{ protected: double x; double y; public: void set_dim(double I, double J ){x = I;y = J;} virtual void show_area(){ cout <<"No area computation defined"<<endl; cout<<"for this class"<<endl;}}; class triangle: public figure{ void show_area(){cout<<"show in triangle"<< x* 0.5 * y<<endl;} }; class circle: public figure{ void show_area(){cout<< "show in circle"<<x *x<<endl;}}; READ void main(){ figure *p; triangle t; circle c; p= &t; p->set_dim(10.0,5.0); p-> show_area(); p= &c; p-> set_dim(10.0, 0); }

Simple App of virtual function

More About Virtual Functions Helps to guarantee that a derived class will provide its own redefinition. If we want to omit the body of a virtual function in a base class, we can use pure virtual functions. virtual ret-type func-name(param-list) = 0; Pure virtual function is a virtual function that has no definition in its base class.

Pure function It makes a class an abstract class. Class figure{ protected: double x,y; public: void set_dim(double I, double j){ x=I; Y= j; } Virtual void show_area()=0 ;// pure function }; It makes a class an abstract class. We cannot create any objects of such classes. It forces derived classes to override it own implementation. Otherwise become abstract too and the complier will report an error.

Simple App of virtual function Class figure{ protected: double x,y; public: void set_dim(double I, double j=0){ x=I; Y= j; } Virtual void show_area()=0 ;// pure function }; Class triangle: public figure{ Public: Void show_area(){cout<< x* 0.5 * y;}}; Class circle: public figure{ Public: // no definiton of show_area() will case error }; Int main(){ Figure *p; Triangle t; Circle c; // illegal – can’t create P= &t; P-> set_dim(10.0,5.0); P-> show_area(); p= &c; P-> set_dim(10.0); Return0; }

Abstract class If a class has at least one pure virtual function, then that class is said to be abstract. An abstract class has one important feature: there are can be no object of the class. Instead, abstract class must be used only as a base that other classes will inherit. Even if the class is abstract, you still can use it to declare pointers, which are needed to support runt time polymorphism.

Final Comments Run-time polymorphism is not automatically activated in C++. We have to use virtual functions and base class pointers to enforce and activate run-time polymorphism in C++.

Applying Polymorphism Early binding Normal functions, overloaded functions Nonvirtual member and friend functions Resolved at compile time Very efficient But lacks flexibility Late binding Virtual functions accessed via a base class pointer Resolved at run-time Quite flexible during run-time But has run-time overhead; slows down program execution