一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

通过虚继承某个基类,就是在告诉编译器:从当前这个类再派生出来的子类只能拥有那个基类的一个实例。

虚继承的语法:

1 class Teacher:virtual public Person
2 
3 {
4 
5 }

这样做的话便可以让Student和Teacher类都虚继承自Person类,编译器将确保从Student和Teacher类再派生出来的子类只能拥有一份Person类的属性。

实例:虚继承应用

  1 #include <iostream>
  2 #include <string> 
  3 //虚继承可以让Student和Teacher类都虚继承自Person类,
  4 //编译器将确保从Student和Teacher类再派生出来的子类只能拥有一份Person类的属性。
  5 using namespace std;
  6 
  7 #include <string>
  8 //人类 
  9 class Person
 10 {
 11 public:
 12     Person(string theName);//构造函数,theName为类的输入参数 
 13     void introduce();
 14 protected:
 15     string name;
 16 };
 17 Person::Person(string theName)//构造函数实现 
 18 {
 19     name = theName;
 20 }
 21 void Person::introduce()//introduce()函数实现 
 22 {
 23     cout << "大家好,我是" << name << "。\n\n";
 24 }
 25 
 26 //老师类继承于人类 
 27 class Teacher:virtual public Person//虚继承,再有类继承Teacher类时,将只拥有一份Person类的属性。 
 28 {
 29 public:
 30     Teacher(string theName,string theClass);
 31     
 32     void teach();//教书 
 33     void introduce();
 34 protected:
 35     string classes;
 36 };
 37 Teacher::Teacher(string theName,string theClass):Person(theName)//老师的名字继承于人类中的名字 
 38 {
 39     classes = theClass;
 40 }
 41 void Teacher::teach()
 42 {
 43     cout<< name << ""<< classes << "。\n\n";
 44 }
 45 void Teacher::introduce()
 46 {
 47     cout<<"大家好,我是 "<< name <<" ,我教 "<< classes << "。\n\n";
 48 }
 49 
 50 //学生类继承于人类
 51 class Student:virtual public Person//虚继承,再有类继承Student类时,将只拥有一份Person类的属性 
 52 {
 53 public:
 54     Student(string theName,string theClass);
 55     
 56     void attendClass();//要上课 
 57     void introduce();
 58 protected:
 59     string classes;
 60 };
 61 Student::Student(string theName,string theClass):Person(theName)//学生名字继承于人类中的名字 
 62 {
 63     classes = theClass;
 64 }
 65 void Student::attendClass()
 66 {
 67     cout<< name <<"加入"<< classes << "学习。\n\n";
 68 }
 69 void Student::introduce()
 70 {
 71     cout<< "大家好,我是" << name << ",我在" << classes << "学习。\n\n";
 72 }
 73 
 74 //助教类既继承于老师类,又继承于学生类 
 75 class Assistant:public Teacher,public Student
 76 {
 77 public:
 78     Assistant(string theName,string classTeaching,string classAttending);
 79     
 80     void introduce();
 81 };
 82 Assistant::Assistant(string theName,string classTeaching,string classAttending)
 83 :Teacher(theName, classTeaching),Student(theName,classAttending),Person(theName)
 84 //由于虚继承,Teacher和Student都不能拥有Person类中的属性和方法
 85 //只能由Person类自己给出 
 86 {
 87    //多继承 助教既继承老师类,又继承学生类 
 88 }
 89 void Assistant::introduce()
 90 {
 91     cout << "大家好,我是" << Student::name << ".我教" << Teacher::classes << "";
 92     cout << "同时我在" << Student::classes << "学习。\n\n"; 
 93 }
 94 
 95 int main()
 96 {
 97     Teacher teacher("小甲鱼","C++入门班");
 98     Student student("迷途羔羊","C++入门班");
 99     Assistant assistant("丁丁","C++入门班","C++进阶班");
100     
101     teacher.introduce();
102     teacher.teach();
103     
104     student.introduce();
105     student.attendClass();
106     
107     assistant.introduce();
108     assistant.teach();
109     assistant.attendClass();
110     
111     return 0;
112 }
posted on 2023-08-18 15:06  一杯清酒邀明月  阅读(36)  评论(0编辑  收藏  举报