1: /** @file timevirtual.cpp 2: A follow-up to timeslice.cpp. 3: */ 5: #include <iostream> 6: using namespace std; 8: #include "time.h" 9: #include "zonetime.h" 12: void DisplayTimeWithBanner 13: ( 14: Time& someTime //in And note the reference parameter this time! 15: ) 16: /**< 17: Display a time within a simple banner. 18: @pre someTime contains a Time object or an object of a derived class. 19: @post The value in someTime has been displayed in "banner form". 20: */ 21: { 22: cout << "\n***************************"; 23: cout << "\n** The time is "; 24: someTime.display(); 25: cout << "\n***************************\n"; 26: } 29: int main() 30: { 31: cout << "\nThis program illustrates the \"static binding\" problem " 32: "that prevents \"passing\nby reference\" from solving the " 33: "\"slicing problem\" we observed in timeslice.cpp."; 34: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 36: cout << "\nFirst we declare the same Time object as before." 37: "\nThen we display it with a call to DisplayTimeWithBanner()."; 38: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 39: Time myTime(8, 30, 0); 40: DisplayTimeWithBanner(myTime); 41: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 42: cout << "\nOutput is again what you would expect, since we are again " 43: "\npassing a Time object and that's what the function expects."; 44: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 46: cout << "\nNext we declare the same ZoneTime object as before." 47: "\nThen we display it with a call to DisplayTimeWithBanner()."; 48: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 49: ZoneTime yourTime(10, 45, 0, CST); 50: DisplayTimeWithBanner(yourTime); 51: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 52: cout << "\nThe hoped-for improvement does not happen, and once again " 53: "we do not get\nthe time zone part of the ZoneTime object printed " 54: "out. The reason is that\neven though no \"slicing\" takes place " 55: "this time (because of the passing by\nreference) the compiler " 56: "still has to decide ***at compile-time*** which\ndisplay() function " 57: "is going to be used, the one on the Base class or the\none in the " 58: "derived class. Because the parameter being passed is of type\nTime " 59: "and \"static binding\" is used, the display() from the Time class " 60: "is\nthe one chosen to be called."; 61: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 63: cout << "\nQuestion: So ... what to do?"; 64: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 66: cout << "\nAnswer:" 67: "\nGo back to the Time class specification file and make the " 68: "display() function\na \"virtual function\" by simply placing " 69: "the keyword \"virtual\" in front of its\nprototype. This tells " 70: "the compiler to insert the necessary code to allow the\ndecision " 71: "to be made at run-time as to which version of the display() " 72: "function\nwill be called. This solves our problem."; 73: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 74: }