Вы находитесь на странице: 1из 34

Polymorphism

Polymorphism

Polymorphism is a major strength of an object centered paradigm

Same general type of action…..

 Accomplished in different ways

 By different types of objects

The underlying software system


Decides how to achieve the action

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-1-
Polymorphism

Polymorphism

Key issue…..
When to implement the action
Compile time
Early Binding
Allows greater execution speed
Achieved through optimized code

Run time
Late Binding
Allows for greater flexibility
Opportunity for abstraction

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-2-
Polymorphism

Polymorphism and C++


Early
Binding occurs at compile time
Early binding polymorphism
Process of overloading members
Late
Binding occurs at runtime
Late binding polymorphism
The code to implement the method is chosen at runtime

Appropriate code chosen sending a message to


the object …. Not to the pointer to the object
Implemented through virtual functions

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-3-
Polymorphism

Virtual Functions

A virtual function must be declared in a parent class

syntax
virtual function
virtual returnType functionName ( argsi ) { function body ;}

pure virtual function


virtual returnType functionName ( argsi ) = 0;

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-4-
Polymorphism

Virtual Functions

Declaration
A function name is preceded by the keyword virtual
 Function name can only be used once in the parent class
 Cannot overload virtual functions
 Only class member functions can be declared virtual

A function is virtual…..
 If it is declared virtual

 There is a base class function with the same signature


declared virtual

Any or all class member functions (except constructors)


can be declared virtual

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-5-
Polymorphism

Virtual Functions
Implementation

 The body of the virtual function must be supplied in the parent


class unless declared to be a pure virtual function

 A derived class can override the definition by providing its own


implementation
If the re-declaration does not match exactly…...
The function not considered virtual for that class

 A virtual function still permitted in a subsequently derived class

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-6-
Polymorphism

Virtual Functions

Such a capability permits multiple functions to be called through a


common interface.

Can be overridden by explicit qualification with the scope operator.

Public Interface

Base

Derived1
Derived2
Derived3 Gives Uniform Function
…….. Call Interface
Derivedn

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-7-
Polymorphism

Virtual Functions

When function in a class is declared virtual

Keyword virtual tells compiler


 Don’t perform early binding
 Install mechanisms to perform late binding

Compiler responds by creating


 Table of function pointers
 Installing a data member to the class to point to the table

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-8-
Polymorphism

Virtual Functions

The compiler created table is called the vtable (vtbl)


Contains pointers to all functions declared virtual within the class
and derived classes.

Each class gets its own vtable

A data member called the vpointer (vPtr)


Usually placed as the first element in object in memory.
Initialized to the starting address of the vtable.

The function call through a base class pointer


Indexes into the vtable calls the function located at the address.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


-9-
Polymorphism

vtable[0] &f ( )
class A
{
public: vtable[1] &g ( )

int i;
virtual void f ( ); vptr
class A
virtual void g( ); vtable
}; i

class A

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 10 -
Polymorphism

class A class B : public A


{ {
public: public:
int i; virtual void f ( ); // override f( )
virtual void f ( ); virtual void g ( ); // define g ()
}; };

vtable[0] &f ( ) vtable[0] &f ( )

class A vtable[1] &g ( )


vtable

class B
vtable
Copyright 2006 Oxford Consulting, Ltd 1 February2006
- 11 -
Polymorphism

Virtual Functions - vtable

 Contains pointers to all virtual functions.

 Each class gets its own vtable.

 Abstract classes have no vtable.

 Vtable size is proportional to the number of virtual functions.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 12 -
Polymorphism

Virtual Functions - Invocation


A virtual function is invoked through a public base class pointer or
reference.
Runtime Binding
 Typically polymorphic binding is done dynamically at
runtime
 Virtual functions are not inlined

Compile Time Binding


 Occasionally have compile time polymorphic binding
 Invoked through an object of the class type
 Invoked using the scope operator
 Invoked through a constructor or destructor

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 13 -
Polymorphism

Virtual Functions - Access Protection

The access level of a virtual function is determined by

 Access level in class of the pointer through which it’s


invoked

 Not by the class in which it’s defined.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 14 -
Polymorphism

A
B : public A Declare a and public virtual function f()
C : public B public virtual function f() in B
D : public C protected virtual function f() in C
E : public D private virtual function f() in D

Write:
1. A* a = new B;
a-> f(); // f() accessible through *a (as a *B - *a in public area)

2. a = new C;
a-> f(); // f() accessible through *a (as a *C - a* in public area)

3. C* c = new D;
c-> f(); // f() not accessible through *c (as a *D - c* in protected area)

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 15 -
Polymorphism

Virtual Destructors

When a base class pointer is used to refer to a derived class


object and the object is deleted…..

Only the base class destructor will be invoked leaving behind


the derived class parts of the object.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 16 -
Polymorphism

Virtual Destructors

syntax
virtual ~ class ClassName ( ) { destructor body }

Specifying a destructor as virtual ensures all appropriate destructors


are invoked.

Rule of thumb…..If a class is abstract then declare the destructor as


virtual.

Don’t declare the destructor if there are no other virtual functions.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 17 -
Polymorphism

Virtual Destructors

Invocation order….

 The derived type destructor

 The destructor for each base class…..


…...Invoked in turn in normal fashion

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 18 -
Polymorphism

Polymorphism and Object Slicing

One must exercise caution when treating objects polymorphically

There is a distinct difference between passing objects by


value and by reference.

When a derived class object is passed by value to a


function expecting a base class value….

The derived class portion is sliced off.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 19 -
Polymorphism

Pure Virtual Functions

….A virtual function must be defined when it is declared


 Abstract base class may be defined that is not intended to
be instantiated

 If virtual function is declared pure …. an implementation


may still be supplied

 Derived class may use implementation

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 20 -
Polymorphism

Pure Virtual Functions

When a function is declared pure…..

 There is no address to put into the vtable

 The 0 keys the compiler that no instances of


this class can be created

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 21 -
Polymorphism

Pure Virtual Functions


Restrictions
A class with one or more pure virtual functions.
1. Can only be used as a base class
2. Cannot have instances
3. Cannot be used as
 An argument type
 Return type
 Type for explicit conversion
4. Can be used as a
 Pointer
 Reference type

A class cannot define a pure virtual destructor

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 22 -
Polymorphism

Pure Virtual Definitions

There may be occasions when it’s desirable to share code with


derived classes but not duplicate in each class.

Can prevent base class instantiation yet provide a definition for a pure
virtual function.

syntax
virtual returnType functionName ( argsi ) = 0 { function body }

access
BaseClassName :: functionName ( );

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 23 -
Polymorphism

Virtual Functions
Rules for Virtual Functions

1. Virtual functions called from within a constructor use the local


version.
2. The first class in a derivation hierarchy that declares a virtual
function it must provide a definition or it must declare the virtual
function to be pure
3. If a definition is provided, the definition serves as the default
instance in subsequent derivations
4. If pure, a subsequently derived class must provide a definition -
to have instances or inherit the pure virtual function - have no
instances

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 24 -
Polymorphism

Class 1 vf11( )
Virtual Functions vf12( )
must define vf11( ) and vf12( )

Class 2 vf12( )
can have instances

pvf13( )
Class 3
no instances

Class 4 no instances

pvf13( ) =
defines pvf13( )
Class 5
can have instances

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 25 -
Polymorphism

Virtual Functions - Access Level

The access level of a virtual function is…..

Specified in the class where it is defined

Not by initial definition

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 26 -
Polymorphism

Virtual Base Classes

Parent classes may have a common base class

Fruit Fruit

Peach Plum Peach Plum

Stem Stem

Nectarine

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 27 -
Polymorphism

Virtual Base Classes

Problem:

 Fruit has a stem data member

 Peach and plum each inherit a stem member from Fruit

 Nectarine inherits a stem member from each

 Could resolve using the scope operator


Plum::stem
Peach::stem

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 28 -
Polymorphism

Virtual Base Classes

Solution:
Declare Fruit as a virtual base class

Result:
Only a single copy of the base class in the derivation hierarchy.
Only a single copy of all inherited data members.
Subsequent derivations point to shared members.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 29 -
Polymorphism

Virtual Base Classes - Specification

Syntax

class DerivedClass : virtual accessSpec BaseClass


DerivedClass - The class being derived
BaseClass - The parent class
Specification - Specify base class member access
public
protected
private

The keyword virtual identifies BaseClass as a virtual base class of


DerivedClass.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 30 -
Polymorphism

Virtual Base Classes - Implementation

Non-Virtual Derivation

A Data Members
A Data Members

B Data Members

B Data Members

Virtual Derivation

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 31 -
Polymorphism

Virtual Base Classes - Access Protection

When there are multiple paths from a common root …

….the most public path dominates.

Fruit
virtual public virtual private

Peach Plum

Nectarine
Copyright 2006 Oxford Consulting, Ltd 1 February2006
- 32 -
Polymorphism

Virtual Base Classes - Initialization

A virtual base class is initialized by the most derived class.

Initialization Order:

1. Constructors for any virtual base class(es).

2. Constructors for any non-virtual base class.

3. The most derived class must provide initialization values.

Copyright 2006 Oxford Consulting, Ltd 1 February2006


- 33 -
Polymorphism

Virtual Base Classes - Initialization

Specify class E…
class E : public D, public C, public virtual F

virtual base class


A
virtual
virtual
B C

F virtual
D

E
Copyright 2006 Oxford Consulting, Ltd 1 February2006
- 34 -

Вам также может понравиться