Source of timevf.cpp


  1: // Filename: TIMEVF.CPP
  2: // iurpose:  Illustrates the "static binding" problem that
  3: //           prevents "passing by reference" from solving
  4: //           the "slicing problem" we had in TIMESLIC.CPP.

  6: #include <iostream>
  7: using namespace std;

  9: #include "TIME.H"
 10: #include "ZONETIME.H"


 13: void DisplayTimeWithBanner(/* in */ Time& someTime)
 14: // Pre:  someTime contains a Time object or an object of a derived class.
 15: // Post: The value in someTime has been displayed in "banner form".
 16: {
 17:     cout << "***************************" << endl;
 18:     cout << "** The time is ";
 19:     someTime.Display();
 20:     cout << endl;
 21:     cout << "***************************" << endl << endl;
 22: }


 25: int main()
 26: {
 27:     Time myTime(8, 30, 0);
 28:     ZoneTime yourTime(10, 45, 0, CST);

 30:     cout << endl;
 31:     DisplayTimeWithBanner(myTime);
 32:     // This call continues to work as before, as expected.

 34:     DisplayTimeWithBanner(yourTime);
 35:     // The hoped-for improvement does not happen, and once again
 36:     // we do not get the time zone part of the ZoneTime object
 37:     // printed out.  The reason is that even though no "slicing"
 38:     // takes place this time (because of the passing by reference)
 39:     // the compiler still has to decide *at compile-time* which
 40:     // Display() function is going to be used.  Because the parameter
 41:     // being passed is of type Time and "static binding" is used,
 42:     // the Display() from the Time class is chosen.

 44:     // Question: What to do?
 45:     // Answer:   Go back to the Time class specification file and
 46:     //           make the Display() function a "virtual function"
 47:     //           by placing the keyword "virtual" in front of its
 48:     //           prototype.  This tells the compiler to insert the
 49:     //           necessary code to allow the decision to be made at
 50:     //           run-time as to which version of Display() will be.
 51:     //           called.  This solves our problem.

 53:     return 0;
 54: }