首页 > 编程语言 >C++快速入门 第二十九讲:虚继承

C++快速入门 第二十九讲:虚继承

时间:2023-08-18 15:12:04浏览次数:58  
标签:入门 继承 子类 C++ Person 第二十九 Student theName Teacher

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

虚继承的语法:

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 }

标签:入门,继承,子类,C++,Person,第二十九,Student,theName,Teacher
From: https://www.cnblogs.com/ybqjymy/p/17640564.html

相关文章

  • C++快速入门 第三十一讲:错误处理与调试2
    让函数返回错误代码实例:范围限制1#include<iostream>2#include<climits>34usingnamespacestd;5classFactorial6{7public:8Factorial(unsignedshortnum);9unsignedlonggetFactorial();10boolinRange();1112private......
  • C++快速入门 第三十二讲:assert函数和捕获异常
    C语言和C++都有一个专门为调试而准备的工具函数---assert函数。这个函数是在assert.h库文件里定义的。实例1:assert函数应用1#include<cassert>2//assert()函数需要有一个参数,它将测试这个输入参数的真或者假状态3//如果为真Donothing4//如果为假Dosomething......
  • C++快速入门 第十八讲:访问控制
    访问控制:C++提供用来保护(保护意思是对谁可以调用某个方法和访问某一个属性加上一个限制)类里的方法和属性的手段实例1:访问级别应用1//级别允许谁来访问2//public任何代码3//protected这个类本身和它的子类4//private只有......
  • C++无法将类的成员函数赋值给一般的函数指针,解决方案
    遇到需要绑定回调函数的API接口。看了定义的函数指针,是静态的函数指针,将非静态的类成员函数赋值过去的时候,无法编译通过。将成员函数改成静态又得将整个类的内容都改成静态。这种情况下,可以构造匿名函数,引用this,这样可以在类中,将自己的成员函数赋值给需要的函数指针类型上:ser......
  • C++快速入门 第六讲:函数的重载
    函数重载:实质就是用同样的名字再定义一个有着不同参数类型及个数来实现不同操作的函数。实例1:改变同一函数的输入参数类型1#include<iostream>23voidconvertTemperature(doubletempIn,chartypeIn);4voidconvertTemperature(inttempIn,chartypeIn);5......
  • C++快速入门 第七讲:复杂的数据类型
    数组:可以把许多个同类型的值存储在同一变量名下实例1:输入的数据存储到数组中,并计算其和与平均值输出1#include<iostream>23usingnamespacestd;//使用作用域45intmain()6{7intarray[10];8inti;9intsum=0;10doubleaverage;......
  • C++快速入门 第八讲:复杂的数据类型——指针
    小知识:程序以文件的形式存储在硬盘,但它们却是在计算机的内存中运行对于变量可以通过变量名与地址两种方式进行索引,变量的地址在程序执行期间是不会发生变换的地址是计算机内存中的某个位置;指针是专门用来存放地址的特殊类型变量......
  • C++快速入门 第九讲:复杂的数据类型——指针02
    指针的类型必须与由它保存其地址的变量的类型一致,当某个变量的地址给了指针p时,就可以通过*p(即表示该地址的数据)来对该变量数据进行操作一定要牢记一个事实:指针所保存的是内存中的一个地址,它并不保存指向的数据的值本身。因此务必确保指针对应一个已经存在的变量或者一块已经分配......
  • C++快速入门 第十讲:复杂的数据类型——指针和数组
    计算机是把数组以一组连续的内存块保存的。数组的第一个元素的地址为该数组的基地址。实例1:数组元素地址打印1#include<iostream>23usingnamespacestd;45intmain()6{7constunsignedshortITEMS=5;8intintArray[ITEMS]={1,2,3,4,5}......
  • C++快速入门 第十一讲:结构
    结构是一种由程序员自己定义的、由其他变量类型组合而成的数据类型。其所能包含的变量的个数是没有限制的。实例1:简单数据库读写1#include<iostream>2#include<fstream>//文件操作3#include<windows.h>//为了使用Sleep()函数45structFishO......