C++: Polymorphism ( 多态 )

● Meaning “many forms”, polymorphism in OO terminology means a single statement in code that might do different things depending on the context in which it is executed.

○ In this case, rpt[i]->Display() is a polymorphic call (when Display() is a virtual function).

○ Depending on what kind of object we send in at runtime, that line of code can either Report’s Display() method, GradeReport’s Display() method, or OnlineGradeReport’s Display() method.

● One of the great advantages from polymorphism is that old (existing) code can can call new (being developed) code without modification.

○ If we created another class in the Report hierarchy (as a subclass of Report or of any subclass of Report), then we can write a new display() method for it, and ShowReport() will call the new Display() method without modfication.

1 #include <iostream>  2 #include <string>  3  using namespace std;  4   5 #define DEBUGBUILD 0  6 #define DEBUG if (DEBUGBUILD) cout   7   8 class Date{  9 private: 10     int day; 11     int month; 12     int year; 13 public: 14     Date() { DEBUG << "Date: default ctor" << endl; } 15     Date(int m, int d, int y) {  16         DEBUG << "Date: 3 int ctor" << endl; 17         day=d; 18         month=m; 19         year=y; 20     } 21     void Display(void) { cout << month << "/" << day << "/" << year << endl; } 22 }; // end class Date 23  24 class Time { 25 private: 26     int hour; 27     int minute; 28     int second; 29 public: 30     Time() { DEBUG << "Time: default ctor" << endl; } 31     Time(int h, int m, int s) { 32         DEBUG << "Time: 3 int ctor" << endl; 33         hour=h; 34         minute=m; 35         second=s; 36     } 37     void Display() { cout << hour << ":" << minute << ":" << second << endl; } 38 }; 39  40 class Report { 41 private: 42     Date repDate; 43     Time repTime; 44     string repDesc; 45 public: 46     Report() : repDate(1,1,1970), repTime(0,0,0), repDesc("") { 47         DEBUG << "Report: default ctor" << endl; 48         repDesc = ""; 49     } 50     Report(Date d, Time t, string desc) : repDate(d), repTime(t){ 51         DEBUG << "Report: date time string ctor" << endl; 52         repDesc = desc; 53     } 54     virtual void Display() { 55         cout << "Date: "; 56         repDate.Display(); 57         cout << "Time: "; 58         repTime.Display(); 59         cout << "Description: "; 60         DisplayDesc(); 61     } 62     void DisplayDesc() { cout << repDesc << endl; } 63 }; // end class Report 64  65 class GradeReport : public Report { 66 private: 67     int StudentID; 68     int CourseID; 69 public: 70     GradeReport() : StudentID(0), CourseID(0) 71     { DEBUG << "GradeReport: default ctor" << endl; } 72  73     GradeReport(Date d, Time t, string desc, int sid, int cid) :  74     Report(d, t, desc), StudentID(sid), CourseID(cid) 75     { DEBUG << "GradeReport: 5 parameters ctor" << endl; } 76  77     GradeReport(const GradeReport& gr) :  78     Report(gr), StudentID(gr.StudentID), CourseID(gr.CourseID) 79     { DEBUG << "GradeReport: Copy ctor" << endl; } 80  81     ~GradeReport()  { DEBUG << "GradeReport: dtor" << endl; } 82  83     virtual void Display() { 84         DisplayID(); 85         cout << "Course ID: " << CourseID << endl; 86         Report::Display(); 87     } 88  89     void DisplayID() { cout << "Student ID: " << StudentID << endl; } 90 }; // end class GradeReport 91  92 class OnlineGradeReport : public GradeReport { 93 public: 94     enum ReportStatus {LOGGED, INFORMED, CONFIRMED};   95 private: 96     string program; 97     string deptDesc; 98     ReportStatus repStatus; 99 public:100     OnlineGradeReport() : program(""), deptDesc(""), repStatus(LOGGED)101     { DEBUG << "OnlineGradeReport: default ctor" << endl; }102 103     OnlineGradeReport(Date d, Time t, string desc, int sid, int cid, string pro, string dept, 104         ReportStatus s) : 105     GradeReport(d, t, desc, sid, cid), program(pro), deptDesc(dept), repStatus(s)106     { DEBUG << "OnlineGradeReport: 8 parameters ctor" << endl; }107 108     OnlineGradeReport(const OnlineGradeReport& or) : 109     GradeReport(or), program(or.program), deptDesc(or.deptDesc), repStatus(or.repStatus)110     { DEBUG << "OnlineGradeReport: Copy ctor" << endl; }111 112     ~OnlineGradeReport() { DEBUG << "OnlineGradeReport: dtor" << endl; }113     virtual void Display() {114         DisplayStatus();115         cout << "Program: " << program << endl;116         cout << "Department: " << deptDesc << endl;117         GradeReport::Display();118     }119     void DisplayStatus() {120         switch(repStatus)121         {122         case LOGGED:123             cout << "The grade is logged by the professor." << endl;124             break;125         case INFORMED:126             cout << "The Records Office has informed the student of the grade." << 127                 endl;128             break;129         case CONFIRMED:130             cout << "The student has confirmed receiving the grade report." << endl;131             break;132         } // end switch133     } // end fun134 }; // end class135 136 void main() {137     Date today(6, 4, 2011);138     Time t(8, 0, 0);139     GradeReport gradeA(today, t, "CS360", 1234, 100);140 141     Date today2(7, 4, 2011);142     Time t2(18, 0, 0);143     Report status(today2, t2, "July Report");144 145     Date today3(8, 4, 2011);146     Time t3(26, 5, 0);147     OnlineGradeReport or = OnlineGradeReport(today3, t3, "CS350", 1234, 100, "MSCS", 148         "Computer Science", OnlineGradeReport::ReportStatus::CONFIRMED);149 150     Report *rpt[3];151     rpt[0] = &gradeA;152     rpt[1] = &status;153     rpt[2] = &or;154 155     for(int i = 0; i < 3; i++)156     {157         rpt[i]->Display();158         cout << endl;159     }160 }

原文链接: https://www.cnblogs.com/ashu/archive/2011/06/28/2092119.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/27766

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午5:21
下一篇 2023年2月8日 上午5:22

相关推荐