• C++继承和派生的基本概念


    继承和派生的概念
    • 继承:在定义一个新的类B时,如果该类与某 个已有的类A相似(指的是B拥有A的全部特点), 那么就可以把A作为一个基类,而把B作为基 类的一个派生类(也称子类)
    • 派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量
      和成员函数。
    • 派生类一经定义后,可以独立使用,不依赖于基类。
    •  派生类拥有基类的全部成员函数和成员变 量,不论是private、protected、public 。
    • 在派生类的各个成员函数中,不能访问基类中的private成员。

    接下来我们来讲几个例子!

    需要继承机制的例子 

    所有的学生都有的共同属性:

    姓名

    学号

    性别

    成绩

    所有的学生都有的共同方法(成员函数):

    是否该留级

    是否该奖励

    而不同的学生,又有各自不同的属性和方法

    研究生

    导师

    大学生

    中学生

    竞赛特长加分

    • 如果为每类学生都从头编写一个类,显然会有不少重复的代码,可能会造成浪费。
    • 如果为每类学生都从头编写一个类,显然会有不少重复的代码,浪费。
    • 比较好的做法是编写一个“学生”类,概括了 各种学生的共同特点,然后从“学生”类派 生出“大学生”类,“中学生”类,“研究生类”

    派生类的写法

    1. class 派生类名:public 基类名
    2. {
    3. };

    然后给大家看一个派生的小例子:

    1. #include
    2. using namespace std;
    3. class CStudent { //学生类
    4. private:
    5. string sName; //姓名
    6. int nAge; //年龄
    7. public:
    8. bool IsThreeGood() { }; //是不是三好学生
    9. void SetName( const string & name ) //给这个学生一个名字
    10. { sName = name; } //赋值
    11. //......
    12. };
    13. class CUndergraduateStudent: public CStudent { //大学生类
    14. private:
    15. int nDepartment; //他是什么类的
    16. public:
    17. bool IsThreeGood() { /*......*/ }; //覆盖(都有这个函数)
    18. bool CanBaoYan() { /*....*/ }; //有没有保研的资格
    19. }; // 派生类的写法是:类名: public 基类名
    20. class CGraduatedStudent:public CStudent { //研究生
    21. private:
    22. int nDepartment; //他是什么类的
    23. char szMentorName[20]; //他的导师是谁?
    24. public:
    25. int CountSalary() { /*...*/ }; //当助教的工资是多少?
    26. };

    派生类对象的内存空间

    派生类对象的体积,等于基类对象的体积,再加上派 生类对象自己的成员变量的体积。 在派生类对象中,包 含着基类对象 ,而且基类对象的存储位置位于派生类对 象新增的成员变量 之前
    1. class CBase
    2. {
    3.         int v1,v2;
    4. };
    5. class CDerived:public CBase
    6. {
    7.         int v3;
    8. };

    学籍管理系统完整代码:

    1. #include
    2. #include
    3. using namespace std;
    4. class CStudent {
    5. private:
    6. string name;
    7. string id; //学号
    8. char gender; //性别,'F'代表女,'M'代表男
    9. int age;
    10. public:
    11. void PrintInfo();
    12. void SetInfo( const string & name_,const string & id_,
    13. int age_, char gender_ );
    14. string GetName() { return name; }
    15. };
    16. class CUndergraduateStudent:public CStudent
    17. {//本科生类,继承了CStudent类
    18. private:
    19. string department; //学生所属的系的名称
    20. public:
    21. void QualifiedForBaoyan() { //给予保研资格
    22. cout << "qualified for baoyan" << endl;
    23. }
    24. void PrintInfo() {
    25. CStudent::PrintInfo(); //调用基类的PrintInfo
    26. cout << "Department:" << department <
    27. }
    28. void SetInfo( const string & name_,const string & id_,int age_,char gender_ ,const string & department_) {
    29. CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
    30. department = department_;
    31. }
    32. };
    33. void CStudent::PrintInfo()
    34. {
    35. cout << "Name:" << name << endl;
    36. cout << "ID:" << id << endl;
    37. cout << "Age:" << age << endl;
    38. cout << "Gender:" << gender << endl;
    39. }
    40. void CStudent::SetInfo( const string & name_,const string & id_, int age_,char gender_ )
    41. {
    42. name = name_;
    43. id = id_;
    44. age = age_;
    45. gender = gender_;
    46. }
    47. int main()
    48. {
    49. CUndergraduateStudent s2;
    50. s2.SetInfo("Harry Potter", "18829212",19,'M',"Computer Science");
    51. cout << s2.GetName() <<" ";
    52. s2.QualifiedForBaoyan ();
    53. s2.PrintInfo ();
    54. return 0;
    55. }
    课后习题:如果多种事物,有一些共同的特点,又有一些各自 不同的特点,如何编写类来代表这些事物比较合适?
    A) 为每种事物独立编写一个类,各类之间互相无关
    B) 写一个类代表其中一种事物,代表其他事物的类, 都从这个类派生出来
    C) 概括所有事物的共同特点,写一个基类。然后为每种事物写一个类,都从基类派生而来
    D) 一共就写一个类,包含所有事物的所有特点,然后用一个成员变量作为标记来区分不同种类的事物
    想要回答的小伙伴可以在评论区留言!
  • 相关阅读:
    iTextSharp操作PDF
    【代码随想录】【数组】59.螺旋矩阵II
    tornado无验证demo
    Redis 源码安装(CentOS 单机)
    清理vdbench后台进程
    【NLP】使用 BERT 和 PyTorch Lightning 进行多标签文本分类
    操作系统学习笔记4 | CPU管理 && 多进程图像
    AppStore审核被拒:other-other,过审核、不过审的经历
    Go语言error错误处理
    第一章:网络协议的奥秘
  • 原文地址:https://blog.csdn.net/wo_ai_luo_/article/details/127793147