Ex8_4.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:5k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例8.4】虚基类在多层多重继承中的应用--在职研究生类定义。
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. enum Tsex{mid,man,woman};
  6. //为简化,本例定义学生类时课程省略,并全部用string字符串
  7. class Person{
  8. string IdPerson;     //身份证号
  9. string Name;     //姓名
  10. Tsex Sex;         //性别
  11. int Birthday;     //生日,格式1986年8月18日写作19860818
  12. string HomeAddress;     //家庭地址
  13. public:
  14. Person(string, string,Tsex,int, string);
  15. Person();
  16. ~Person();
  17. void PrintPersonInfo();
  18. //其他接口函数
  19. };
  20. Person::Person(string id, string name,Tsex sex,int birthday, string homeadd){
  21. cout<<"构造Person"<<endl;
  22. IdPerson=id;
  23. Name=name;
  24. Sex=sex;
  25. Birthday=birthday;
  26. HomeAddress=homeadd;
  27. }
  28. Person::Person(){
  29. cout<<"构造Person"<<endl;
  30. Sex=mid;//string对象成员不处理,默认值为空串
  31. Birthday=0;
  32. }
  33. Person::~Person(){
  34. cout<<"析构Person"<<endl;
  35. } // IdPerson, Name, HomeAddress析构时自动调用它们自己的析构函数来释放内存空间
  36. void Person::PrintPersonInfo(){
  37. int i;
  38. cout<<"身份证号:"<<IdPerson<<'n'<<"姓名:"<<Name<<'n'<<"性别:";
  39. if(Sex==man)cout<<"男"<<'n';
  40. else if(Sex==woman)cout<<"女"<<'n';
  41.      else cout<<" "<<'n';
  42. cout<<"出生年月日:";
  43. i=Birthday;
  44. cout<<i/10000<<"年";
  45. i=i%10000;
  46. cout<<i/100<<"月"<<i%100<<"日"<<'n'<<"家庭住址:"<<HomeAddress<<'n';
  47. }
  48. class Student:public virtual Person{           //以虚基类定义公有派生的学生类
  49. string NoStudent;                   //学号
  50. //30门课程与成绩略
  51. public:
  52. Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud);
  53. //注意派生类构造函数声明方式
  54. Student();
  55.     ~Student(){cout<<"析构Student"<<endl;}
  56. void PrintStudentInfo();
  57. };
  58. Student::Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud)
  59. :Person(id,name,sex,birthday,homeadd){      //注意Person参数表不用类型
  60. cout<<"构造Student"<<endl;
  61. NoStudent=nostud;
  62. }
  63. Student::Student(){                        //基类缺省的无参数构造函数不必显式给出
  64. cout<<"构造Student"<<endl;
  65. }
  66. void Student::PrintStudentInfo(){
  67. cout<<"学号:"<<NoStudent<<'n';
  68. PrintPersonInfo();
  69. }
  70. class GStudent:public Student{                   //以虚基类定义公有派生的研究生类
  71. string NoGStudent;                      //研究生号
  72. //其他略
  73. public:
  74. GStudent(string id, string name,Tsex sex,int birthday, string homeadd, string nostud,
  75. string nogstudent);                     //注意派生类构造函数声明方式
  76. GStudent();
  77. ~GStudent(){cout<<"析构GStudent"<<endl;};
  78. void PrintGStudentInfo();
  79. };
  80. GStudent::GStudent(string id, string name,Tsex sex, int birthday, string homeadd,
  81.  string nostud, string nogstud)
  82. :Student(id,name,sex,birthday,homeadd,nostud),Person(id,name,sex,birthday,homeadd){
  83. //因Person是虚基类,尽管不是直接基类,如定义GStudent对象,Person必须出现。
  84. //不定义对象可不出现,为通用应出现。如不是虚基类,出现是错误的
  85. cout<<"构造GStudent"<<endl;
  86. NoGStudent=nogstud;
  87. }
  88. GStudent::GStudent(){                      //基类缺省的无参数构造函数不必显式给出
  89. cout<<"构造GStudent"<<endl;
  90. }
  91. void GStudent::PrintGStudentInfo(){
  92. cout<<"研究生号:"<<NoGStudent<<'n';
  93. PrintStudentInfo();
  94. }
  95. class Employee:public virtual Person{          //以虚基类定义公有派生的教职工类
  96. string NoEmployee;                  //教职工号
  97. //其他略
  98. public:
  99. Employee(string id, string name,Tsex sex,int birthday, string homeadd, string noempl);
  100. //注意派生类构造函数声明方式
  101. Employee();
  102. ~Employee(){cout<<"析构Employee"<<endl;}
  103. void PrintEmployeeInfo();
  104. void PrintEmployeeInfo1();   //多重继承时避免重复打印虚基类Person的信息
  105. };
  106. Employee::Employee(string id, string name,Tsex sex,int birthday, string homeadd, string noempl)
  107. :Person(id,name,sex,birthday,homeadd){    //注意Person参数表可不用类型
  108. cout<<"构造Employee"<<endl;
  109. NoEmployee=noempl;
  110. }
  111. Employee::Employee(){                    //基类缺省的无参数构造函数不必显式给出
  112. cout<<"构造Employee"<<endl;
  113. }
  114. void Employee::PrintEmployeeInfo(){
  115. cout<<"教职工号:"<<NoEmployee<<'n';
  116. PrintPersonInfo();
  117. }
  118. void Employee::PrintEmployeeInfo1(){cout<<"教职工号:"<<NoEmployee<<'n';}
  119. class EGStudent:public Employee,public GStudent{ //以虚基类定义公有派生的在职研究生类
  120. string NoEGStudent;                          //在职学习号
  121. //其他略
  122. public:
  123. EGStudent(string id, string name,Tsex sex,int birthday, string homeadd, string nostud,
  124. string nogstud, string noempl, string noegstud);
  125. //注意派生类构造函数声明方式
  126. EGStudent();
  127. ~EGStudent(){cout<<"析构EGStudent"<<endl;};
  128. void PrintEGStudentInfo();
  129. };
  130. EGStudent::EGStudent(string id, string name,Tsex sex,int birthday, string homeadd,
  131. string nostud, string nogstud, string noempl, string noegstud)
  132. :GStudent(id,name,sex,birthday,homeadd,nostud,nogstud),
  133. Employee(id,name,sex,birthday,homeadd,noempl),
  134. Person(id,name,sex,birthday,homeadd){ //注意要定义EGStudent对象,Person必须出现
  135. cout<<"构造EGStudent"<<endl;
  136. NoEGStudent=noegstud;
  137. }
  138. EGStudent::EGStudent(){                 //基类缺省的无参数构造函数不必显式给出
  139. cout<<"构造EGStudent"<<endl;
  140. }
  141. void EGStudent::PrintEGStudentInfo(){
  142. cout<<"在职学习号:"<<NoEGStudent<<'n';
  143. PrintEmployeeInfo1();   //多重继承时避免重复打印虚基类Person的信息
  144. PrintGStudentInfo();    // 虚基类Person的信息仅在GStudent中打印
  145. }
  146. int main(void){
  147. EGStudent egstu1("320102811226161","朱海鹏",man,19811226,"南京市黄浦路1号",
  148. "06000123", "034189","06283","030217");
  149. egstu1.PrintEGStudentInfo();
  150. GStudent gstu1("320102820818161","沈俊",man,19820818,"南京四牌楼2号",
  151. "08000312","058362");
  152. gstu1.PrintGStudentInfo();
  153. return 0;
  154. }