Nheritance, polymorphism, and virtual functions

Содержание

Слайд 2

What Is Inheritance? Provides a way to create a new class

What Is Inheritance?

Provides a way to create a new class from

an existing class
The new class is a specialized version of the existing class

CS1 -- Inheritance and Polymorphism

Слайд 3

Example: Insect Taxonomy CS1 -- Inheritance and Polymorphism

Example: Insect Taxonomy

CS1 -- Inheritance and Polymorphism

Слайд 4

The "is a" Relationship Inheritance establishes an "is a" relationship between

The "is a" Relationship

Inheritance establishes an "is a" relationship between classes.
A

poodle is a dog
A car is a vehicle
A flower is a plant
A football player is an athlete

CS1 -- Inheritance and Polymorphism

Слайд 5

Inheritance – Terminology and Notation in C++ Base class (or parent)

Inheritance – Terminology and Notation in C++

Base class (or parent) –

inherited from
Derived class (or child) – inherits from the base class
Notation:
class Student // base class
{
. . .
};
class UnderGrad : public student
{ // derived class
. . .
};

CS1 -- Inheritance and Polymorphism

Слайд 6

Back to the ‘is a’ Relationship An object of a derived

Back to the ‘is a’ Relationship

An object of a derived class

'is a(n)' object of the base class
Example:
an UnderGrad is a Student
a Mammal is an Animal
A derived object has all of the characteristics of the base class

CS1 -- Inheritance and Polymorphism

Слайд 7

What Does a Child Have? An object of the derived class

What Does a Child Have?

An object of the derived class has:
all

members defined in child class
all members declared in parent class
An object of the derived class can use:
all public members defined in child class
all public members defined in parent class

CS1 -- Inheritance and Polymorphism

Слайд 8

Protected Members and Class Access protected member access specification: like private,

Protected Members and Class Access

protected member access specification: like private, but

accessible by objects of derived class
Class access specification: determines how private, protected, and public members of base class are inherited by the derived class

CS1 -- Inheritance and Polymorphism

Слайд 9

Class Access Specifiers public – object of derived class can be

Class Access Specifiers

public – object of derived class can be treated

as object of base class (not vice-versa)
protected – more restrictive than public, but allows derived classes to know details of parents
private – prevents objects of derived class from being treated as objects of base class.

CS1 -- Inheritance and Polymorphism

Слайд 10

Inheritance vs. Access CS1 -- Inheritance and Polymorphism

Inheritance vs. Access

CS1 -- Inheritance and Polymorphism

Слайд 11

Inheritance vs. Access CS1 -- Inheritance and Polymorphism

Inheritance vs. Access

CS1 -- Inheritance and Polymorphism

Слайд 12

Inheritance vs. Access CS1 -- Inheritance and Polymorphism

Inheritance vs. Access

CS1 -- Inheritance and Polymorphism

Слайд 13

Inheritance vs. Access CS1 -- Inheritance and Polymorphism

Inheritance vs. Access

CS1 -- Inheritance and Polymorphism

Слайд 14

Constructors and Destructors in Base and Derived Classes Derived classes can

Constructors and Destructors in Base and Derived Classes

Derived classes can have

their own constructors and destructors
When an object of a derived class is created, the base class’s constructor is executed first, followed by the derived class’s constructor
When an object of a derived class is destroyed, its destructor is called first, then that of the base class

CS1 -- Inheritance and Polymorphism

Слайд 15

Constructors and Destructors in Base and Derived Classes CS1 -- Inheritance and Polymorphism

Constructors and Destructors in Base and Derived Classes

CS1 -- Inheritance and

Polymorphism
Слайд 16

Constructors and Destructors in Base and Derived Classes CS1 -- Inheritance and Polymorphism

Constructors and Destructors in Base and Derived Classes

CS1 -- Inheritance and

Polymorphism
Слайд 17

Constructors and Destructors in Base and Derived Classes CS1 -- Inheritance and Polymorphism

Constructors and Destructors in Base and Derived Classes

CS1 -- Inheritance and

Polymorphism
Слайд 18

Passing Arguments to Base Class Constructor Allows selection between multiple base

Passing Arguments to Base Class Constructor

Allows selection between multiple base class

constructors
Specify arguments to base constructor on derived constructor heading:
Square::Square(int side) : Rectangle(side, side)
Can also be done with inline constructors
Must be done if base class has no default constructor

CS1 -- Inheritance and Polymorphism

Слайд 19

Passing Arguments to Base Class Constructor CS1 -- Inheritance and Polymorphism

Passing Arguments to Base Class Constructor

CS1 -- Inheritance and Polymorphism

Square::Square(int side):Rectangle(side,side)

derived

class constructor

base class constructor

derived constructor parameter

base constructor parameters

Слайд 20

Redefining Base Class Functions Redefining function: function in a derived class

Redefining Base Class Functions

Redefining function: function in a derived class that

has the same name and parameter list as a function in the base class
Typically used to replace a function in base class with different actions in derived class

CS1 -- Inheritance and Polymorphism

Слайд 21

Redefining Base Class Functions Not the same as overloading – with

Redefining Base Class Functions

Not the same as overloading – with overloading,

parameter lists must be different
Objects of base class use base class version of function; objects of derived class use derived class version of function

CS1 -- Inheritance and Polymorphism

Слайд 22

Base Class CS1 -- Inheritance and Polymorphism

Base Class

CS1 -- Inheritance and Polymorphism

Слайд 23

Derived Class CS1 -- Inheritance and Polymorphism Redefined setScore function

Derived Class

CS1 -- Inheritance and Polymorphism

Redefined setScore function

Слайд 24

Driver Program CS1 -- Inheritance and Polymorphism

Driver Program

CS1 -- Inheritance and Polymorphism

Слайд 25

Problem with Redefining Consider this situation: Class BaseClass defines functions x()

Problem with Redefining

Consider this situation:
Class BaseClass defines functions x() and y().

x() calls y().
Class DerivedClass inherits from BaseClass and redefines function y().
An object D of class DerivedClass is created and function x() is called.
When x() is called, which y() is used, the one defined in BaseClass or the the redefined one in DerivedClass?

CS1 -- Inheritance and Polymorphism

Слайд 26

Problem with Redefining CS1 -- Inheritance and Polymorphism BaseClass DerivedClass void

Problem with Redefining

CS1 -- Inheritance and Polymorphism

BaseClass

DerivedClass

void X();
void Y();
void Y();

DerivedClass D;
D.X();

Object

D invokes function X()
In BaseClass. Function X()
invokes function Y() in BaseClass, not function Y() in DerivedClass,
because function calls are bound at compile time. This is static binding.
Слайд 27

Class Hierarchies CS1 -- Inheritance and Polymorphism A base class can

Class Hierarchies

CS1 -- Inheritance and Polymorphism

A base class can be derived

from another base class.
Слайд 28

Class Hierarchies CS1 -- Inheritance and Polymorphism Consider the GradedActivity, FinalExam,

Class Hierarchies

CS1 -- Inheritance and Polymorphism

Consider the GradedActivity, FinalExam, PassFailActivity, PassFailExam

hierarchy in Chapter 15.
Слайд 29

Polymorphism and Virtual Member Functions Virtual member function: function in base

Polymorphism and Virtual Member Functions

Virtual member function: function in base class

that expects to be redefined in derived class
Function defined with key word virtual:
virtual void Y() {...}
Supports dynamic binding: functions bound at run time to function that they call
Without virtual member functions, C++ uses static (compile time) binding

CS1 -- Inheritance and Polymorphism

Слайд 30

Polymorphism and Virtual Member Functions CS1 -- Inheritance and Polymorphism Because

Polymorphism and Virtual Member Functions

CS1 -- Inheritance and Polymorphism

Because the parameter

in the displayGrade function is a GradedActivity reference variable, it can reference any object that is derived from GradedActivity. That means we can pass a GradedActivity object, a FinalExam object, a PassFailExam object, or any other object that is derived from GradedActivity.
A problem occurs in Program 15-10 however...
Слайд 31

CS1 -- Inheritance and Polymorphism

CS1 -- Inheritance and Polymorphism

Слайд 32

CS1 -- Inheritance and Polymorphism As you can see from the

CS1 -- Inheritance and Polymorphism

As you can see from the example

output, the getLetterGrade member function returned ‘C’ instead of ‘P’. This is because the GradedActivity class’s getLetterGrade function was executed instead of the PassFailActivity class’s version of the function.
Слайд 33

Static Binding Program 15-10 displays 'C' instead of 'P' because the

Static Binding

Program 15-10 displays 'C' instead of 'P' because the call

to the getLetterGrade function is statically bound (at compile time) with the GradedActivity class's version of the function. We can remedy this by making the function virtual.

CS1 -- Inheritance and Polymorphism

Слайд 34

Virtual Functions A virtual function is dynamically bound to calls at

Virtual Functions

A virtual function is dynamically bound to calls at runtime. At

runtime, C++ determines the type of object making the call, and binds the function to the appropriate version of the function.

CS1 -- Inheritance and Polymorphism

Слайд 35

Virtual Functions To make a function virtual, place the virtual key

Virtual Functions

To make a function virtual, place the virtual key word

before the return type in the base class's declaration:
virtual char getLetterGrade() const;
The compiler will not bind the function to calls. Instead, the program will bind them at runtime.

CS1 -- Inheritance and Polymorphism

Слайд 36

Updated Version of GradedActivity CS1 -- Inheritance and Polymorphism The function

Updated Version of GradedActivity

CS1 -- Inheritance and Polymorphism

The function is now

virtual.

The function also becomes virtual in all derived classes automatically!

Слайд 37

Polymorphism CS1 -- Inheritance and Polymorphism If we recompile our program

Polymorphism

CS1 -- Inheritance and Polymorphism

If we recompile our program with the

updated versions of the classes, we will get the right output, shown here: (See Program 15-11 in the book.)

This type of behavior is known as polymorphism. The term polymorphism means the ability to take many forms.
Program 15-12 demonstrates polymorphism by passing
objects of the GradedActivity and PassFailExam classes to the displayGrade function.

Слайд 38

CS1 -- Inheritance and Polymorphism

CS1 -- Inheritance and Polymorphism

Слайд 39

CS1 -- Inheritance and Polymorphism

CS1 -- Inheritance and Polymorphism

Слайд 40

Polymorphism Requires References or Pointers Polymorphic behavior is only possible when

Polymorphism Requires References or Pointers

Polymorphic behavior is only possible when an

object is referenced by a reference variable or a pointer, as demonstrated in the displayGrade function.

CS1 -- Inheritance and Polymorphism

Слайд 41

Base Class Pointers CS1 -- Inheritance and Polymorphism Can define a

Base Class Pointers

CS1 -- Inheritance and Polymorphism

Can define a pointer to

a base class object
Can assign it the address of a derived class object
Слайд 42

Base Class Pointers Base class pointers and references only know about

Base Class Pointers

Base class pointers and references only know about members

of the base class
So, you can’t use a base class pointer to call a derived class function
Redefined functions in derived class will be ignored unless base class declares the function virtual

CS1 -- Inheritance and Polymorphism

Слайд 43

Redefining vs. Overriding In C++, redefined functions are statically bound and

Redefining vs. Overriding

In C++, redefined functions are statically bound and overridden

functions are dynamically bound. So, a virtual function is overridden, and a non-virtual function is redefined.

CS1 -- Inheritance and Polymorphism

Слайд 44

Virtual Destructors It's a good idea to make destructors virtual if

Virtual Destructors

It's a good idea to make destructors virtual if the

class could ever become a base class.
Otherwise, the compiler will perform static binding on the destructor if the class ever is derived from.
See Program 15-14 for an example

CS1 -- Inheritance and Polymorphism

Слайд 45

Abstract Base Classes and Pure Virtual Functions Pure virtual function: a

Abstract Base Classes and Pure Virtual Functions

Pure virtual function: a virtual

member function that must be overridden in a derived class that has objects
Abstract base class contains at least one pure virtual function:
virtual void Y() = 0;
The = 0 indicates a pure virtual function
Must have no function definition in the base class

CS1 -- Inheritance and Polymorphism

Слайд 46

Abstract Base Classes and Pure Virtual Functions Abstract base class: class

Abstract Base Classes and Pure Virtual Functions

Abstract base class: class that

can have no objects. Serves as a basis for derived classes that may/will have objects
A class becomes an abstract base class when one or more of its member functions is a pure virtual function

CS1 -- Inheritance and Polymorphism

Слайд 47

Multiple Inheritance CS1 -- Inheritance and Polymorphism A derived class can

Multiple Inheritance

CS1 -- Inheritance and Polymorphism

A derived class can have more

than one base class
Each base class can have its own access specification in derived class's definition:
class cube : public square,
public rectSolid;