• C++之继承


    目录

    一、继承的关系

    二、继承方式和子类权限

    三、子类构造函数

     四、继承的种类


    一、继承的关系

    继承一定要的关系:子类是父类   学生是人   狗是动物

    继承的实现形式:

    class 子类名:继承方式 父类名

    {

            成员变量

            成员函数:

    } ;

    二、继承方式和子类权限

    继承方式:public protected private

    父类

    继承方式

    子类

    Public

    Public

    Public(类内类外都可以访问)

    Protected

    Protected(类内可以访问)

    Private

    不可访问

    1. #include
    2. using namespace std;
    3. /****************父类********************/
    4. class Base
    5. {
    6. public:
    7. int c;
    8. private:
    9. char a;
    10. protected:
    11. int b;
    12. };
    13. /****************子类继承父类********************/
    14. class Inherit:public Base //继承方式:public
    15. {
    16. public:
    17. void test()
    18. {
    19. b = 10; //父类protected,类内可以访问
    20. c = 16; //父类public,类内类外都可以访问
    21. int e;
    22. }
    23. private:
    24. int d;
    25. };
    26. int main()
    27. {
    28. Inherit inherit1;
    29. cout<<sizeof(inherit1) <
    30. inherit1.c = 15; //父类public,类内类外都可以访问
    31. return 0;
    32. }

    父类

    继承方式

    子类

    Public

    Protected

    Protected(类内可以访问)

    Protected

    Protected(类内可以访问)

    Private

    不可访问

    1. #include
    2. using namespace std;
    3. /****************父类********************/
    4. class Base
    5. {
    6. public:
    7. int c;
    8. private:
    9. char a;
    10. protected:
    11. int b;
    12. };
    13. /****************子类继承父类********************/
    14. class Inherit :protected Base //继承方式:protected
    15. {
    16. public:
    17. void test()
    18. {
    19. b = 10; //父类protected,类内可以访问
    20. c = 16; //父类public,类内可以访问
    21. int e;
    22. }
    23. private:
    24. int d;
    25. };
    26. int main()
    27. {
    28. Inherit inherit1;
    29. cout << sizeof(inherit1) << endl;
    30. return 0;
    31. }

    父类

    继承方式

    子类

    Public

    Private

    Private(类内可以访问)

    Protected

    Private(类内可以访问)

    Private

    不可访问

    1. #include
    2. using namespace std;
    3. /****************父类********************/
    4. class Base
    5. {
    6. public:
    7. int c;
    8. private:
    9. char a;
    10. protected:
    11. int b;
    12. };
    13. /****************子类继承父类********************/
    14. class Inherit :private Base //继承方式:private
    15. {
    16. public:
    17. void test()
    18. {
    19. b = 10; //父类protected,类内可以访问
    20. c = 16; //父类public,类内可以访问
    21. int e;
    22. }
    23. private:
    24. int d;
    25. };
    26. int main()
    27. {
    28. Inherit inherit1;
    29. cout << sizeof(inherit1) << endl;
    30. return 0;
    31. }

    规律:

    • 继承关系中,不论是哪种继承关系,只要是父类的private的,子类都是不可访问的;
    • 继承之后,子类的权限跟继承方式有关,跟父类的权限无关; 
    • 如果只衍生一代,private和pritected的继承方式类似,子类都只能在类内访问;
      如果衍生两代的话,继承方式private只能衍生一代,protected可以继续衍生
    1. #include
    2. using namespace std;
    3. /****************父类********************/
    4. class Base
    5. {
    6. public:
    7. int c;
    8. private:
    9. char a;
    10. protected:
    11. int b;
    12. };
    13. /****************子类继承父类********************/
    14. class Inherit :private Base //继承方式:private
    15. {
    16. public:
    17. void test()
    18. {
    19. b = 10; //父类protected,类内可以访问
    20. c = 16; //父类public,类内可以访问
    21. }
    22. private:
    23. int d;
    24. };
    25. /****************子子类继承子类********************/
    26. class AA:public Inherit//由于子类继承方式是private,所以子子类无法再继承
    27. {
    28. void test1()
    29. {
    30. }
    31. public:
    32. int e;
    33. private:
    34. int f;
    35. protected:
    36. int g;
    37. };
    38. int main()
    39. {
    40. Inherit inherit1;
    41. cout << sizeof(inherit1) << endl;
    42. return 0;
    43. }

    三、子类构造函数

    子类实例化对象:父类构造  子类构造

    子类对象生命周期结束:子类析构  父类析构

     1、Person.h

    1. #ifndef _PERSON_H_
    2. #define _PERSON_H_
    3. #include
    4. using namespace std;
    5. #include
    6. class Person
    7. {
    8. public:
    9. Person();
    10. Person(string _name);
    11. Person(string _name,int _age,string _sex="女");
    12. ~Person();
    13. void eat();
    14. void sleep();
    15. protected:
    16. string name;
    17. int age;
    18. string sex;
    19. };
    20. #endif

    2、Person.cpp

     每个函数名前需要加上类的作用域

    1. #include "Person.h"
    2. Person::Person()
    3. {
    4. cout << "Person()" << endl;
    5. }
    6. Person::Person(string _name):name(_name)
    7. {
    8. cout << "Person(string)" << endl;
    9. }
    10. Person::Person(string _name, int _age, string _sex):name(_name),age(_age),sex(_sex)
    11. {
    12. cout << "Person(string,int,string)" << endl;
    13. }
    14. Person::~Person()
    15. {
    16. cout << "~Person()" << endl;
    17. }
    18. void Person::eat()
    19. {
    20. cout << name << "去吃饭了" << endl;
    21. }
    22. void Person::sleep()
    23. {
    24. cout << name << "去睡觉了" << endl;
    25. }

    3、Worker.h

    1. #pragma once
    2. #include "Person.h"
    3. class Worker :public Person
    4. {
    5. public:
    6. Worker();
    7. Worker(string _name);
    8. Worker(string _name,int _age,string _sex,int _salary);
    9. void work();
    10. void show();
    11. ~Worker();
    12. protected:
    13. int salary;
    14. };

    4、Worker.cpp

    1. #include "Worker.h"
    2. Worker::Worker()
    3. {
    4. cout << "Worker()" << endl;
    5. }
    6. Worker::Worker(string _name):Person(_name)
    7. {
    8. cout << "Worker(string)" << endl;
    9. }
    10. void Worker::work()
    11. {
    12. cout <"在工作" << endl;
    13. }
    14. Worker::Worker(string _name, int _age, string _sex, int _salary):Person(_name,_age,_sex),salary(_salary)
    15. {
    16. cout << "Worker(string,int,string,int)" << endl;
    17. }
    18. void Worker::show()
    19. {
    20. cout << "name="<
    21. cout << "age=" << age << endl;
    22. cout << "sex=" << sex << endl;
    23. cout << "salary=" << salary << endl;
    24. }
    25. Worker::~Worker()
    26. {
    27. cout << "~Worker()" << endl;
    28. }

     5、main.cpp

    1. #include"Worker.h"
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. Worker worker("Liy",12,"男",17222);
    7. worker.show();
    8. return 0;
    9. }

    运行结果:

     四、继承的种类

    1、多层继承

    特点:从父类到子类越来越具体,最终实例化的时候只需要实例化子类的最后一个对象即可

    1、Person.h

    1. #ifndef _PERSON_H_
    2. #define _PERSON_H_
    3. #include
    4. using namespace std;
    5. #include
    6. class Person
    7. {
    8. public:
    9. Person();
    10. Person(string _name);
    11. Person(string _name,int _age,string _sex="女");
    12. ~Person();
    13. void eat();
    14. void sleep();
    15. void setName(string _name);
    16. void setAge(int _age);
    17. void setSex(string _age);
    18. protected:
    19. string name;
    20. int age;
    21. string sex;
    22. };
    23. #endif

    2、Worker.h

    1. #pragma once
    2. #include "Person.h"
    3. class Worker :public Person
    4. {
    5. public:
    6. Worker();
    7. Worker(string _name);
    8. Worker(string _name,int _age,string _sex,int _salary);
    9. void work();
    10. void show();
    11. ~Worker();
    12. void setSalary(int _salary);
    13. protected:
    14. int salary;
    15. };

     3、Programmer.h

    1. #pragma once
    2. #include "Worker.h"
    3. class Programmer : public Worker
    4. {
    5. public:
    6. Programmer();
    7. Programmer(string _name,string _level);
    8. void coding();
    9. ~Programmer();
    10. void setLevel(string _level);
    11. protected:
    12. string level;
    13. };

     4、Person.cpp

    1. #include "Person.h"
    2. Person::Person()
    3. {
    4. cout << "Person()" << endl;
    5. }
    6. Person::Person(string _name):name(_name)
    7. {
    8. cout << "Person(string)" << endl;
    9. }
    10. Person::Person(string _name, int _age, string _sex):name(_name),age(_age),sex(_sex)
    11. {
    12. cout << "Person(string,int,string)" << endl;
    13. }
    14. Person::~Person()
    15. {
    16. cout << "~Person()" << endl;
    17. }
    18. void Person::eat()
    19. {
    20. cout << name << "去吃饭了" << endl;
    21. }
    22. void Person::sleep()
    23. {
    24. cout << name << "去睡觉了" << endl;
    25. }
    26. void Person::setName(string _name)
    27. {
    28. }
    29. void Person::setAge(int _age)
    30. {
    31. }
    32. void Person::setSex(string _age)
    33. {
    34. }

     5、Worker.cpp

    1. #include "Worker.h"
    2. Worker::Worker()
    3. {
    4. cout << "Worker()" << endl;
    5. }
    6. Worker::Worker(string _name):Person(_name)
    7. {
    8. cout << "Worker(string)" << endl;
    9. }
    10. void Worker::work()
    11. {
    12. cout <"在工作" << endl;
    13. }
    14. Worker::Worker(string _name, int _age, string _sex, int _salary):Person(_name,_age,_sex),salary(_salary)
    15. {
    16. cout << "Worker(string,int,string,int)" << endl;
    17. }
    18. void Worker::show()
    19. {
    20. cout << "name="<
    21. cout << "age=" << age << endl;
    22. cout << "sex=" << sex << endl;
    23. cout << "salary=" << salary << endl;
    24. }
    25. Worker::~Worker()
    26. {
    27. cout << "~Worker()" << endl;
    28. }
    29. void Worker::setSalary(int _salary)
    30. {
    31. }

    6、 Programmer.cpp

    1. #include "Programmer.h"
    2. Programmer::Programmer()
    3. {
    4. cout << "Programmer()" << endl;
    5. }
    6. Programmer::Programmer(string _name, string _level):Worker(_name),level(_level)
    7. {
    8. cout << "Programmer(string,string)" << endl;
    9. }
    10. void Programmer::coding()
    11. {
    12. cout <"工程师" << name<<"在敲代码"<
    13. }
    14. Programmer::~Programmer()
    15. {
    16. cout << "~Programmer()" << endl;
    17. }
    18. void Programmer::setLevel(string _level)
    19. {
    20. }

    2、多重继承(菱形继承)

    图片举例

  • 相关阅读:
    Linux安装JDK最新版
    Java并发编程:start和run的区别
    基于ssm的旅店管理系统
    后端分页应该注意的事项
    Apache DolphinScheduler 3.0.0 正式版发布!
    数据结构之查找
    C++ 堆、大顶堆、小顶堆、堆排序
    机器学习吴恩达
    102. 二叉树的层序遍历
    leetcode 101. Symmetric Tree 对称二叉树(简单)
  • 原文地址:https://blog.csdn.net/2301_79561199/article/details/136429481