Virtual Function in C++
Virtual Function in C++
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
Virtual Functions
syntax
virtual function
virtual returnType functionName ( argsi ) { function body ;}
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
Virtual Functions
Implementation
Virtual Functions
Public Interface
Base
Derived1
Derived2
Derived3 Gives Uniform Function
…….. Call Interface
Derivedn
Virtual Functions
Virtual Functions
vtable[0] &f ( )
class A
{
public: vtable[1] &g ( )
int i;
virtual void f ( ); vptr
class A
virtual void g( ); vtable
}; i
class A
class B
vtable
Copyright 2006 Oxford Consulting, Ltd 1 February2006
- 11 -
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)
Virtual Destructors
Virtual Destructors
syntax
virtual ~ class ClassName ( ) { destructor body }
Virtual Destructors
Invocation order….
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 ( );
Virtual Functions
Rules for Virtual Functions
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
Fruit Fruit
Stem Stem
Nectarine
Problem:
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.
Syntax
Non-Virtual Derivation
A Data Members
A Data Members
B Data Members
B Data Members
Virtual Derivation
Fruit
virtual public virtual private
Peach Plum
Nectarine
Copyright 2006 Oxford Consulting, Ltd 1 February2006
- 32 -
Polymorphism
Initialization Order:
Specify class E…
class E : public D, public C, public virtual F
F virtual
D
E
Copyright 2006 Oxford Consulting, Ltd 1 February2006
- 34 -