Object Oriented Programming in C++ Chapter 7 Dynamic Binding.
-
Upload
lenard-robinson -
Category
Documents
-
view
219 -
download
0
description
Transcript of Object Oriented Programming in C++ Chapter 7 Dynamic Binding.
![Page 1: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/1.jpg)
Object Oriented Programming in
C++
Chapter 7Dynamic Binding
![Page 2: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/2.jpg)
class Employeeclass Employee{
public:Employee( String nm, int ag ) ;Employee( ) ;void print( void ) const ;
private:String name;int age;
};
Employeenameage
![Page 3: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/3.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/4.jpg)
Manager inherits from Employeeclass Manager : public Employee{
public:Manager( String nm, int ag, int lev );Manager( );void print( void ) const
private:int level;
};
Employeenameage
Managernameagelevelprint
print redefined
![Page 5: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/5.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/6.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/7.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/8.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/9.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/10.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/11.jpg)
Virtual functions Default is static binding - faster
Dynamic binding only if specifically requested
![Page 12: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/12.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/13.jpg)
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
Workernameage
![Page 14: Object Oriented Programming in C++ Chapter 7 Dynamic Binding.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/14.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/15.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022081807/5a4d1b927f8b9ab0599c1f2a/html5/thumbnails/16.jpg)
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