• c++ 继承


    什么是继承

    比如你创建一个类:叫person ,你的目的是用这个类来存放不同职业的人的年龄,工作,姓名 你可以在这个类中定义以下的成员变量和成员函数:

    class Person
    {
    public:
     void Print()
     {
     cout << "name:" << _name << endl;
     cout << "age:" << _age << endl;
     }
    protected:
     string _name = "peter"; // 姓名
     int _age = 18;  // 年龄
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这个时候,假如有个学校的校长来让你把他们学校的老师同学 的信息存储起来,这个时候就可以用到你的这个person 类了,但是你发现,这个person 类有个缺点,就是老师工号 学生有 学号 这是两个不同种类的信息呀,难道要定义在同一个类中吗?
    这个时候,一种新的玩法就来了。
    你可以单独定义2个类,一个类叫Student 用来存放学生的学号,一个类叫Teacher用来存放老师的工号,但是呢,学生和老师的有共同特点的信息,比如年龄和姓名之类的可以继续沿用上面person类的定义,那该怎样写呢?

    #include
    using namespace std;
    class Person
    {
    public:
    	void Print()
    	{
    		cout << "name:" << _name << endl;
    		cout << "age:" << _age << endl;
    	}
    protected:
    	string _name = "peter"; 
    	int _age = 18; 
    };
    
    class Student : public Person
    {
    protected:
    	int _stuid;  // 学号
    };
    
    class Teacher : public Person
    {
    protected:
    	int _jobid; //工号
    };
    
    int main()
    {
    	Student s;
    	Teacher t;
    
    	s.Print();
    	t.Print();
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述
    上面的这种写法就是 继承

    继承的定义

    定义的格式

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    我们可以得出下面的一个表格:
    在这里插入图片描述
    在这里插入图片描述

    这里,我们来理解一下protectedprivate
    在以前,我们认为它们的区别不是那么明显:都是在类外面不能使用,只能在类里面使用。
    但是现在,如果我们想定义一个成员变量,这个成员变量可以继承(也就是可以被子类使用)但是只能在子类中使用,不能在类外使用,由于,private成员变量不能被子类使用,所以我们这个时候可以用protected
    总结:

    1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私
      有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面
      都不能去访问它。
    2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在
      派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
    3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他 成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式), public > protected private
    4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过
      最好显示的写出继承方式。
    5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡
      使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里
      面使用,实际中扩展维护性不强

    is-a 的关系

    不同类型之间的对象赋值的时候,如果是相近的类型可以隐式类型转换,隐式类型转换的话会产生临时变量
    在这里插入图片描述

    但是临时变量具有常性,所以,当你想要这样写时,是错的:
    在这里插入图片描述

    在这里插入图片描述
    说那么多,就是想说下面的这种情况:

    int main()
    {
    
    	Student s;
    	Person p = s;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这个student类可不可以赋值给Person类呢?想想我们之前举的例子。
    答:可以,
    因为他们也是相近的类型,一个person是父类,一个student是子类,
    所以,在公有继承的前提下,personstudent的关系可以比拟成is-a的关系。

    “is-a” 是面向对象编程中描述继承关系的一种概念。它表示一个类(A)是另一个类(B)的子类或派生类,也可以说类B是类A类或基类。这意味着类A继承了类B的所有属性和方法,同时可以添加自己的属性和方法,以扩展或特化类B的功能。继承关系允许在类之间建立层次结构,使代码重用和扩展更加方便。

    例如,如果有一个类 “动物” 和一个类 “狗”,你可以说 “狗 is-a 动物”,这意味着 “狗” 类继承了 “动物” 类的属性和方法,因为狗是一种动物。这允许你在 “狗” 类中使用 “动物” 类的功能,并在需要时添加独特于狗的属性和方法。

    继承关系有助于提高代码的可维护性和可扩展性,因为它允许你在不必重新编写现有代码的情况下创建新的类,并在现有类的基础上构建新的功能。这是面向对象编程中的一个重要概念,有助于组织和抽象复杂的代码结构。

    在上面的列子中,Teacher是人 ,Teachar is a PersonStudent 也是人,Student is a Person 他们都有人的共同属性,都可以继承Person类中的属性,并且可以拥有自己的独特的属性。

    父类和子类在公有继承的前提下,是is-a的关系,注意,公有继承的前提

    这个时候在分析一下下面的写法对不对?
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    但是就,这种情况一般是子类 赋值给 父类, 即:父类是子类中父类那一部分属性的别名
    不能父类赋值给子类。

  • 相关阅读:
    水文科技新仪器——地埋式积水探测器
    结构体入门到进阶
    Jenkins-jenkins凭证管理与代码拉取
    Unity捏脸工具
    windows服务器通过nginx配置https
    【软考 系统架构设计师】计算机组成与体系结构⑦ 校验码
    Linux fork和vfork函数用法
    2023年4月到7月工作经历
    Vue中$nextTick实现源码解析
    解决 pdf.js 出现 TypeError: key.split(...).at is not a function 报错问题
  • 原文地址:https://blog.csdn.net/laochendashuaibi/article/details/134188382