Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

16
Object Oriented Programming in C++ Chapter 7 Dynamic Binding

description

Implementation of Employee’s methods Employee ::Employee( String nm, int ag ) : age( ag ), name( nm ) { } Employee ::Employee( ): age(0), name("") { } void Employee ::print( void ) const { cout

Transcript of Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Page 1: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Object Oriented Programming in

C++

Chapter 7Dynamic Binding

Page 2: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

class Employeeclass Employee{

public:Employee( String nm, int ag ) ;Employee( ) ;void print( void ) const ;

private:String name;int age;

};

Employeenameage

print

Page 3: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Implementation of Employee’s methodsEmployee ::Employee( String nm, int ag ) : age( ag ), name( nm )

{ }

Employee ::Employee( ) : age(0), name("") { }

void Employee ::print( void ) const{

cout << "Name " << name << " Age " << age; }

Page 4: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Manager inherits from Employeeclass Manager : public Employee{

public:Manager( String nm, int ag, int lev );Manager( );void print( void ) const

private:int level;

};

Employeenameage

print

Managernameagelevelprint

print redefined

Page 5: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Manager’s member functionsManager ::Manager( char* nm, int ag, int lev )

: Employee( nm, ag ), level( lev ) { }Manager :: Manager( )

: Employee( ), level( 0 ) { }void Manager :: print( void ) const{

Employee::print(); cout << " Level " << level;

}

Page 6: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Using Employee and ManagerEmployee emp1( “Shem ", 42 );Employee emp2( “Ham ", 32 );Manager mgr1( “Yefet", 50, 3 );Manager mgr2( “Zefet ", 46, 2 );emp1.print();// Employee’s print functionemp2.print();// “ “ “mgr1.print();// Manager’s print functionmgr2.print();// “ “ “

Name Shem Age 42Name Ham Age 32Name Yefet Age 50 Level 3Name Zefet Age 46 Level 2

Page 7: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Storing pointers to objects, then printing

Employee* employees[4]; // array of pointers to Employee objects

employees[0] = &emp1; // Store address of emp1 in first array elementemployees[1] = &mgr1; // store address of mgr1 in second elementemployees[2] = &emp2; // etc.employees[3] = &mgr2; // etc.

for ( int i = 0; i < 4; i++ ){

employees[i]->print(); // call print member function of each elementcout << endl;

}

Page 8: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Oops…Name Shem Age 42Name Yefet Age 50Name Ham Age 32Name Zefet Age 46

Not what we had expected The Employee version of print() has been invoked for

objects of both Employee and Manager This was determined at compile-time - Static Binding by

reference to the array element type (Employee*) We want the Manager version of print() to be called for

Manager objects

Page 9: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Solution Make Employee’s print method virtual Ensures that the version of print() invoked is determined

at run-time by reference to the actual object referred to by each pointer stored in the array - Dynamic Binding

In Employee class declaration:virtual void print( void ) const {

cout << "Name " << name << " Age " << age;

} No change required to class Manager

Page 10: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Output from loop with virtual print()Name Shem Age 42Name Yefet Age 50 Level 3Name Ham Age 32Name Zefet Age 46 Level 2

OK now. Base class function is virtual - ensures

Dynamic Binding

Page 11: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Virtual functions Default is static binding - faster

Dynamic binding only if specifically requested

Page 12: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Abstract base classes classes which we never intend to instantiate

• cannot create objects of this class• can declare pointers to this class• vs concrete classes

too generic to define real objects used only as a base class for inheritance

• required to have a derived class made by defining 1 or more virtual functions (methods) as

pure• if derived class does not override all pvf, it becomes an

abstract class as well! A pure virtual function -

virtual void print( void ) const = 0; // no parentheses

Page 13: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Employee as an Abstract classclass Employee{ public:

Employee( String nm, int ag ) :age( ag ), name( nm ){ }

Employee( ): age(0), name("") { }virtual void print( void ) const = 0;

protected:String name;int age;

};

Employeenameage

virtual print

Managernameagelevel

print

Workernameage

print

Page 14: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Class Managerclass Manager : public Employee{

public:Manager( String nm, int ag, int lev ) :Employee( nm, ag ), level( lev ) { }Manager( ) : Employee(), level( 0 ){ }// redefinition of pure virtual functionvoid print( void ) const{ cout << "Name " << name << " Age " << age

<< " Level " << level; }

private:int level;

};

Page 15: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

Class Workerclass Worker : public Employee{

public:Worker ( String nm, int ag ) :Employee( nm, ag ) { }Worker ( ) : Employee() { }// redefinition of pure virtual functionvoid print( void ) const{ cout << "Name " << name << " Age " << age;}

};

Page 16: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.

2 derived classes in Employee* array

Worker wkr1( “Shem ", 42 );Worker wkr2( “Ham ", 32 );Manager mgr1( “Yefet", 50, 3 );Manager mgr2( “Zefet ", 46, 2 );Employee* employees[4];employees[0] = &wkr1; employees[1] = &mgr1;employees[2] = &wkr2; employees[3] = &mgr2;for ( int i = 0; i < 4; i++ ){

employees[i]->print();cout << endl;

}

Name Shem Age 42Name Yefet Age 50 Level 3Name Ham Age 32Name Zefet Age 46 Level 2