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

Similar documents
Virtual functions concepts

Class Sale. Represents sales of single item with no added discounts or charges. Notice reserved word "virtual" in declaration of member function bill

Inheritance (with C++)

Inheritance Basics. Inheritance (with C++) Base class example: Employee. Inheritance begets hierarchies. Writing derived classes

Inheritance. Overview. Chapter 15 & additional topics. Inheritance Introduction. Three different kinds of inheritance

Inheritance. Chapter 15 & additional topics

Inheritance. Chapter 15 & additional topics

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

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

Data Structures and Other Objects Using C++

CISC 181 final overview

5/24/12. Introduction to Polymorphism. Chapter 8. Late Binding. Introduction to Polymorphism. Late Binding. Polymorphism and Abstract Classes

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

15: Polymorphism & Virtual Functions

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

VIRTUAL FUNCTIONS Chapter 10

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

Inheritance, and Polymorphism.

Object-Oriented Concept

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

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

Java Object Oriented Design. CSC207 Fall 2014

Part VIII. More classes. Philip Blakely (LSC) C++ Introduction 226 / 370

Inheritance, Polymorphism, and Interfaces

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

ECE 3574: Dynamic Polymorphism using Inheritance

Comp 249 Programming Methodology Chapter 8 - Polymorphism

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

VALLIAMMAI ENGINEERING COLLEGE

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

OOP Fundamental Concepts

Upcasting. Taking an object reference and treating it as a reference to its base type is called upcasting.

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

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

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

Absolute C++ Walter Savitch

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

04-24/26 Discussion Notes

Compaq Interview Questions And Answers

More C++ : Vectors, Classes, Inheritance, Templates. with content from cplusplus.com, codeguru.com

CS11 Introduction to C++ Fall Lecture 7

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

Object-Oriented Programming

Object Oriented Programming

Inheritance, polymorphism, interfaces

Instantiation of Template class

C++ Programming: Polymorphism

Chapter 8. Operator Overloading, Friends, and References. Copyright 2010 Pearson Addison-Wesley. All rights reserved

Polymorphism. Zimmer CSCI 330

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

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

More C++ : Vectors, Classes, Inheritance, Templates

Increases Program Structure which results in greater reliability. Polymorphism

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

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

Reusable and Extendable Code. Composition Example (1) Composition Example (2) CS183-Su'02-Lecture 8 17 June by Eric A. Durant, Ph.D.

Polymorphism Part 1 1

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

Chapter 1: Object-Oriented Programming Using C++

Object Oriented Programming. CISC181 Introduction to Computer Science. Dr. McCoy. Lecture 27 December 8, What is a class? Extending a Hierarchy

1: Introduction to Object (1)

Programming 2. Inheritance & Polymorphism

step is to see how C++ implements type polymorphism, and this Exploration starts you on that journey.

Framework Fundamentals

Polymorphism. Arizona State University 1

INHERITANCE & POLYMORPHISM. INTRODUCTION IB DP Computer science Standard Level ICS3U. INTRODUCTION IB DP Computer science Standard Level ICS3U

Lecture 13: Object orientation. Object oriented programming. Introduction. Object oriented programming. OO and ADT:s. Introduction

8. Polymorphism and Inheritance

CS152: Programming Languages. Lecture 23 Advanced Concepts in Object-Oriented Programming. Dan Grossman Spring 2011

CS107 Handout 37 Spring 2007 May 25, 2007 Introduction to Inheritance

Problem Solving with C++

Object Oriented Programming COP3330 / CGS5409

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

G Programming Languages - Fall 2012

CPSC 427: Object-Oriented Programming

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?

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

Module 10 Inheritance, Virtual Functions, and Polymorphism

Object Oriented Software Design II

IST311. Advanced Issues in OOP: Inheritance and Polymorphism

Critique this Code. Hint: It will crash badly! (Next slide please ) 2011 Fawzi Emad, Computer Science Department, UMCP

CS Lecture #14

Object Oriented Programming. Solved MCQs - Part 2

Lecture 20: templates

CS Lecture #6. Administrative... Assignment #2 Graded NN Turned In, Average Grade: XX Assignment #3 due on Thursday

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

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

Object Oriented Software Design II

Lecture 5: Inheritance

Dynamic Binding C++ Douglas C. Schmidt

Inheritance, Polymorphism and the Object Memory Model

HAS-A Relationship. Association is a relationship where all objects have their own lifecycle and there is no owner.

Polymorphism CSCI 201 Principles of Software Development

CSCI-1200 Computer Science II Fall 2006 Lecture 23 C++ Inheritance and Polymorphism

Chapter 14. Inheritance. Slide 1

Chapter 14 Inheritance. GEDB030 Computer Programming for Engineers Fall 2017 Euiseong Seo

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

Fast Introduction to Object Oriented Programming and C++

Transcription:

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

Learning Objectives Virtual Function Basics Late binding Implementing virtual functions When to use a virtual function Abstract classes and pure virtual functions Pointers and Virtual Functions Extended type compatibility Downcasting and upcasting C++ "under the hood" with virtual functions 15-2

Virtual Function Basics Polymorphism Associating many meanings to one function Virtual functions provide this capability Fundamental principle of object-oriented programming! Virtual Existing in "essence" though not in fact Virtual Function Can be "used" before it s "defined" 15-3

Figures Example Best explained by example: Classes for several kinds of figures Rectangles, circles, ovals, etc. Each figure an object of different class Rectangle data: height, width, center point Circle data: center point, radius All derive from one parent-class: Figure Require function: draw() Different instructions for each figure 15-4

Figures Example 2 Each class needs different draw function Can be called "draw" in each class, so: Rectangle r; Circle c; r.draw(); //Calls Rectangle class s draw c.draw(); //Calls Circle class s draw Nothing new here yet 15-5

Figures Example: center() Parent class Figure contains functions that apply to "all" figures; consider: center(): moves a figure to center of screen Erases 1 st, then re-draws So Figure::center() would use function draw() to re-draw Complications! Which draw() function? From which class? 15-6

Figures Example: New Figure Consider new kind of figure comes along: Triangle class derived from Figure class Function center() inherited from Figure Will it work for triangles? It uses draw(), which is different for each figure! It will use Figure::draw() won t work for triangles Want inherited function center() to use function Triangle::draw() NOT function Figure::draw() But class Triangle wasn t even WRITTEN when Figure::center() was! Doesn t know "triangles"! 15-7

Figures Example: Virtual! Virtual functions are the answer Tells compiler: "Don t know how function is implemented" "Wait until used in program" "Then get implementation from object instance" Called late binding or dynamic binding Virtual functions implement late binding 15-8

Virtual Functions: Another Example Bigger example best to demonstrate Record-keeping program for automotive parts store Track sales Don t know all sales yet 1 st only regular retail sales Later: Discount sales, mail-order, etc. Depend on other factors besides just price, tax 15-9

Virtual Functions: Auto Parts Program must: Compute daily gross sales Calculate largest/smallest sales of day Perhaps average sale for day All come from individual bills But many functions for computing bills will be added "later"! When different types of sales added! So function for "computing a bill" will be virtual! 15-10

Class Sale Definition class Sale { public: Sale(); Sale(double theprice); double getprice() const; virtual double bill() const; double savings(const Sale& other) const; private: double price; }; 15-11

Member Functions savings and operator < double Sale::savings(const Sale& other) const { return (bill() other.bill()); } bool operator < ( { } const Sale& first, const Sale& second) return (first.bill() < second.bill()); Notice BOTH use member function bill()! 15-12

Class Sale Represents sales of single item with no added discounts or charges. Notice reserved word "virtual" in declaration of member function bill Impact: Later, derived classes of Sale can define THEIR versions of function bill Other member functions of Sale will use version based on object of derived class! They won t automatically use Sale s version! 15-13

Derived Class DiscountSale Defined class DiscountSale : public Sale { public: DiscountSale(); DiscountSale( double theprice, double the Discount); double getdiscount() const; void setdiscount(double newdiscount); double bill() const; private: double discount; }; 15-14

DiscountSale s Implementation of bill() double DiscountSale::bill() const { double fraction = discount/100; return (1 fraction)*getprice(); } Qualifier "virtual" does not go in actual function definition "Automatically" virtual in derived class Declaration (in interface) not required to have "virtual" keyword either (but usually does) 15-15

DiscountSale s Implementation of bill() Virtual function in base class: "Automatically" virtual in derived class Derived class declaration (in interface) Not required to have "virtual" keyword But typically included anyway, for readability 15-16

Derived Class DiscountSale DiscountSale s member function bill() implemented differently than Sale s Particular to "discounts" Member functions savings and "<" Will use this definition of bill() for all objects of DiscountSale class! Instead of "defaulting" to version defined in Sales class! 15-17

Virtual: Wow! Recall class Sale written long before derived class DiscountSale Members savings and "<" compiled before even had ideas of a DiscountSale class Yet in a call like: DiscountSale d1, d2; d1.savings(d2); Call in savings() to function bill() knows to use definition of bill() from DiscountSale class Powerful! 15-18

Virtual: How? To write C++ programs: Assume it happens by "magic"! But explanation involves late binding Virtual functions implement late binding Tells compiler to "wait" until function is used in program Decide which definition to use based on calling object Very important OOP principle! 15-19

Overriding Virtual function definition changed in a derived class We say it s been "overidden" Similar to redefined Recall: for standard functions So: Virtual functions changed: overridden Non-virtual functions changed: redefined 15-20

Virtual Functions: Why Not All? Clear advantages to virtual functions as we ve seen One major disadvantage: overhead! Uses more storage Late binding is "on the fly", so programs run slower So if virtual functions not needed, should not be used 15-21

Pure Virtual Functions Base class might not have "meaningful" definition for some of it s members! It s purpose solely for others to derive from Recall class Figure All figures are objects of derived classes Rectangles, circles, triangles, etc. Class Figure has no idea how to draw! Make it a pure virtual function: virtual void draw() = 0; 15-22

Abstract Base Classes Pure virtual functions require no definition Forces all derived classes to define "their own" version Class with one or more pure virtual functions is: abstract base class Can only be used as base class No objects can ever be created from it Since it doesn t have complete "definitions" of all it s members! If derived class fails to define all pure s: It s an abstract base class too 15-23

Extended Type Compatibility Given: Derived is derived class of Base Derived objects can be assigned to objects of type Base But NOT the other way! Consider previous example: A DiscountSale "is a" Sale, but reverse not true 15-24

Extended Type Compatibility Example class Pet { public: string name; virtual void print() const; }; class Dog : public Pet { public: string breed; virtual void print() const; }; 15-25

Classes Pet and Dog Now given declarations: Dog vdog; Pet vpet; Notice member variables name and breed are public! For example purposes only! Not typical! 15-26

Using Classes Pet and Dog Anything that "is a" dog "is a" pet: vdog.name = "Tiny"; vdog.breed = "Great Dane"; vpet = vdog; These are allowable Can assign values to parent-types, but not reverse A pet "is not a" dog (not necessarily) 15-27

Slicing Problem Notice value assigned to vpet "loses" it s breed field! cout << vpet.breed; Produces ERROR msg! Called slicing problem Might seem appropriate Dog was moved to Pet variable, so it should be treated like a Pet And therefore not have "dog" properties Makes for interesting philosphical debate 15-28

Slicing Problem Fix In C++, slicing problem is nuisance It still "is a" Great Dane named Tiny We d like to refer to it s breed even if it s been treated as a Pet Can do so with pointers to dynamic variables 15-29

Slicing Problem Example Pet *ppet; Dog *pdog; pdog = new Dog; pdog->name = "Tiny"; pdog->breed = "Great Dane"; ppet = pdog; Cannot access breed field of object pointed to by ppet: cout << ppet->breed; //ILLEGAL! 15-30

Slicing Problem Example Must use virtual member function: ppet->print(); Calls print member function in Dog class! Because it s virtual C++ "waits" to see what object pointer ppet is actually pointing to before "binding" call 15-31

Virtual Destructors Recall: destructors needed to de-allocate dynamically allocated data Consider: Base *pbase = new Derived; delete pbase; Would call base class destructor even though pointing to Derived class object! Making destructor virtual fixes this! Good policy for all destructors to be virtual 15-32

Casting Consider: Pet vpet; Dog vdog; vdog = static_cast<dog>(vpet); //ILLEGAL! Can t cast a pet to be a dog, but: vpet = vdog; // Legal! vpet = static_cast<pet>(vdog); //Also legal! Upcasting is OK From descendant type to ancestor type 15-33

Downcasting Downcasting dangerous! Casting from ancestor type to descended type Assumes information is "added" Can be done with dynamic_cast: Pet *ppet; ppet = new Dog; Dog *pdog = dynamic_cast<dog*>(ppet); Legal, but dangerous! Downcasting rarely done due to pitfalls Must track all information to be added All member functions must be virtual 15-34

Inner Workings of Virtual Functions Don t need to know how to use it! Principle of information hiding Virtual function table Compiler creates it Has pointers for each virtual member function Points to location of correct code for that function Objects of such classes also have pointer Points to virtual function table 15-35

Summary 1 Late binding delays decision of which member function is called until runtime In C++, virtual functions use late binding Pure virtual functions have no definition Classes with at least one are abstract No objects can be created from abstract class Used strictly as base for others to derive 15-36

Summary 2 Derived class objects can be assigned to base class objects Base class members are lost; slicing problem Pointer assignments and dynamic objects Allow "fix" to slicing problem Make all destructors virtual Good programming practice Ensures memory correctly de-allocated 15-37