1 chapter 15 polymorphism and virtual functions. 2 learning objectives virtual function basics...

49
1 Chapter 15 Polymorphism and Virtual Functions

Upload: richard-armstrong

Post on 26-Dec-2015

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

1

Chapter 15

Polymorphism and Virtual Functions

Page 2: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

2

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

Page 3: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

3

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"

Page 4: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

4

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

Page 5: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

5

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 drawc.draw(); //Calls Circle class’s draw

• Nothing new here yet…

Page 6: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

6

Figures Example: center()

• Parent class Figure contains functionsthat apply to "all" figures; consider:center(): moves a figure to center of screen

– Erases 1st, then re-draws

– So Figure::center() would use function draw()to re-draw

– Complications!

• Which draw() function?

• From which class?

Page 7: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

7

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 functionTriangle::draw() NOT function Figure::draw()– But class Triangle wasn’t even WRITTEN when

Figure::center() was! Doesn’t know "triangles"!

Page 8: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

8

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

Page 9: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

9

Virtual Functions: Another Example

• Bigger example best to demonstrate

• Record-keeping program for automotiveparts store– Track sales– Don’t know all sales yet– 1st only regular retail sales– Later: Discount sales, mail-order, etc.

• Depend on other factors besides just price, tax

Page 10: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

10

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!

Page 11: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

11

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;

};

Page 12: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

12

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()!

Page 13: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

13

Class Sale

• Represents sales of single item with noadded discounts or charges.

• Notice reserved word "virtual" indeclaration 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!

Page 14: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

14

Derived Class DiscountSale Defined

• class DiscountSale : public Sale{public:

DiscountSale();DiscountSale(double thePrice,double

theDiscount);double getDiscount() const;void setDiscount(double newDiscount);double bill() const;

private:double discount;

};

Page 15: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

15

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)

Page 16: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

16

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

Page 17: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

17

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!

Page 18: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

18

Virtual: Wow!

• Recall class Sale written long beforederived 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!

Page 19: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

19

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!

Page 20: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

20

Overriding

• Virtual function definition changed in aderived class– We say it’s been "overidden"

• Similar to redefined– Recall: for standard functions

• So:– Virtual functions changed: overridden– Non-virtual functions changed: redefined

Page 21: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

21

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, shouldnot be used

Page 22: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

22

Self-Test Exercise 1Explain the difference among the terms virtual function, late binding, and polymorphism.

In essence there is no difference among the three terms. They all refer to the same topic. There is only a slight difference in their usage. (Virtual function is a kind of member function, late binding refers to the mechanism used to decide which function definition to use when a function is virtual, and

polymorphism is another for late binding.)

Page 23: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

23

Self-Test Exercise 2Suppose you modify the definition of the class Sale (Display 15.1) by deleting the reserved word virtual. How would that change the output of the program in Display 15.5?

The output would change to the following:

Discounted item is not cheaper.

Page 24: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

24

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;

Page 25: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

25

Abstract Base Classes

• Pure virtual functions require no definition– Forces all derived classes to define "their

own" version

• Class with one or more pure virtualfunctions 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 allit’s members!

• If derived class fails to define all pure’s:– It’s an abstract base class too

Page 26: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

26

Self-Test Exercise 3Is it legal to have an abstract class in which all member functions are pure virtual functions?

Yes, it is legal to have an abstract class in which all member functions are pure virtual functions.

Page 27: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

27

Self-Test Exercise 4Given the definition of the class Employee in Display 15.6, which of the following are legal?a.

Employee joe;

joe = Employee();

b.

class HourlyEmployee: public Employee

{

public:

HourlyEmployee();

<Some more legal member function definition, none of which are pure virtual functions.>

private:

double wageRate;

double hours;

}

int main()

{

Employee joe;

joe = HourlyEmployee();

}

c.

bool isBossOf(const Employee& e1, const Employee& e2);

a. Illegal, because Employee is an abstract class.

b. Legalc. Legal, because an

abstract class is a type.

Page 28: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

28

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

Page 29: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

29

Extended Type Compatibility Example

• class Pet{public:

string name;virtual void print() const;

};class Dog : public Pet{public:

string breed;virtual void print() const;

};

Page 30: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

30

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!

Page 31: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

31

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, butnot reverse– A pet "is not a" dog (not necessarily)

Page 32: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

32

Slicing Problem

• Notice value assigned to vpet "loses" it’sbreed 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

Page 33: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

33

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

Page 34: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

34

Slicing Problem Example

• Pet *ppet;Dog *pdog;pdog = new Dog;pdog->name = "Tiny";pdog->breed = "Great Dane";ppet = pdog;

• Cannot access breed field of objectpointed to by ppet:cout << ppet->breed; //ILLEGAL!

Page 35: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

35

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

void Dog::print() const{

cout << “name: ” << name << endl;cout << “breed: ” << breed << endl;

}

Page 36: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

36

Self-Test Exercise 5Why can’t you assign a base class object to a derived class variable?

There would be no members to assign to the derived class’s added members.

Page 37: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

37

Self-Test Exercise 6What is the problem with the (legal) assignment of a derived class object to a base class variable?

Although it is legal to assign a derived class object to a base class variable, this discards the parts of the derived class object that are not members of the base class. This situation is known as the slicing problem.

Page 38: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

38

Self-Test Exercise 7Suppose the base class and the derived class each has a member function with the same signature. When you have a base class pointer to a derived class object and call a function member through the pointer, discuss what determines which function is actually called, the base class member function or the derived class member function.

If the base class function carries the virtual modifier, then the derived class member function is called. If the base member function does not have the virtual modifier, then the base class member function is called.

Page 39: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

39

Virtual Destructors

• Recall: destructors needed to de-allocatedynamically 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

Page 40: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

40

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

Page 41: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

41

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

Page 42: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

42

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

Page 43: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

43

Self-Test Exercise 8Why is the following illegal?

Pet vpet;

Dog vdog; //Dog is a derived class with base class Pet.

vdog = static_cast<Dog>(vpet); //ILLEGAL!

Since Dog can have more member variables than pet, the object vpet may not have enough data for all the member variables of type Dog.

Page 44: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

44

Summary 1

• Late binding delays decision of whichmember 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

Page 45: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

45

Summary 2

• Derived class objects can be assigned tobase 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

Page 46: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

46

Homework2

• Programming Project 1 (page 680)– Forms:

• 2 program versions (2 projects)• 1 report (學號 .doc)

• Programming Project 2 (page 681)– Forms:

• 1 program versions (1 project)

• Due date: 5/28 pm 12:00

Page 47: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

47

Programming Project 1Consider a graphics system that has classes for various

figures, say rectangles, squares, triangles, circles, and so on. For example, a rectangle might have data members height, width, and center point, while a square and circle might have only a center point and an edge length or radius, respectively. In a well-designed system these would be derived from a common classes, Figure. You are to implement such a system.

Page 48: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

48

The class Figure is the base class. You should add only Rectangle and Triangle classes derived from Figure. Each class has stubs from member function erase and draw. Each of these member functions outputs a message telling what function has been called and what the class of the calling object is. Since these are just stubs, they do nothing more than output this message. The member function center calls erase and draw to erase and redraw the figure at the center. Because you have only stubs for erase and draw, center will not do any “centering” but will call the member functions erase and draw. Also, add an output message in the member function center that announces that center is being called. The member functions should take no arguments. There are three parts parts to this project:

Page 49: 1 Chapter 15 Polymorphism and Virtual Functions. 2 Learning Objectives Virtual Function Basics –Late binding –Implementing virtual functions –When to

49

1. Do the class definition using no virtual functions. Compile and test.

2. Make the base class member functions virtual. Compile and test.

3. Explain the difference in results.