1: /** @file timeslice.cpp 2: Illustrates the "slicing problem", one of the 3: problems that virtual functions help to solve. 4: */ 6: #include <iostream> 7: using namespace std; 9: #include "time.h" 10: #include "zonetime.h" 12: void DisplayTimeWithBanner 13: ( 14: Time someTime //in 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 \"slicing problem\"."; 32: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 34: cout << "\nFirst we declare a Time object." 35: "\nThen we display it with a call to DisplayTimeWithBanner()."; 36: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 37: Time myTime(8, 30, 0); 38: DisplayTimeWithBanner(myTime); 39: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 40: cout << "\nOutput is what you would expect, since we are passing " 41: "\na Time object and that's what the function expects."; 42: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 44: cout << "\nNext we declare a ZoneTime object." 45: "\nThen we display it with a call to DisplayTimeWithBanner()."; 46: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 47: ZoneTime yourTime(10, 45, 0, CST); 48: DisplayTimeWithBanner(yourTime); 49: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 50: cout << "\nOutput is not what you might hope for. This time we are " 51: "passing an object of\nclass ZoneTime, which is also a Time object " 52: "(any ZoneTime \"is a\" Time, because\nof inheritance), so you " 53: "might hope that the value of the ZoneTime object would\nbe printed " 54: "out. Unfortunately, the ZoneTime value is \"bigger than\" the " 55: "Time\nvalue (occupies more storage space in memory because " 56: "of the additional member\nvariable) but the \"extra part\" is " 57: "\"sliced off\" as it is passed into the\nDisplayTimeWithBanner() " 58: "function because it is passed by value and a copy\nis made to " 59: "a local variable only capable of holding a value of type Time."; 60: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 62: cout << "\nQuestion: Would passing by reference solve this problem? " 63: "\nAnswer: See timevirtual.cpp."; 64: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 65: }