• c++继承


    继承的概念及定义

    1.1继承机制是面向对象继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。这是网上的概念我的理解就是子类可以继承父类的功能,子类访问父类公开的属性,在其属性可以进行扩展。

    如图:继承只能继承父类公开的属性,不能继承父类私有的

    在这里插入图片描述

    1.2继承关系
    >继承方式

    1.3继承访问的关系变化
    在这里插入图片描述
    个人理解总结,公有继承对于基类只要父类成员变量和成员函数是共有和保护的子类就能访问,保护继承是儿子可以继承父亲的属性,但是类外就不能访问。

    基类和派生类对象赋值转换

    切片
    子类对象,子类指针,子类引用,可以赋值给父类
    父类对象不能给子类

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

    继承中的作用域

    1. 在继承体系中基类和派生类都有独立的作用域。
    2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,
      也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
    3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
    4. 注意在实际中在继承体系里面最好不要定义同名的成员。

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

    继承与静态成员

    基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子
    类,都只有一个static成员实例 。

    class person {
    public:
    	static int a;
    	int b;
    private:
    	int c;
    };
    int person::a = 2;
    class son:public person{
    public:
    	void person() {
    		cout<<person::b;
    	}
    	int d;
    };
    int main() {
    	son s;
    	person p;
    	s.a++;
    	s.a++;
    	cout<<s.a<<endl;
    	cout << p.a;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    菱形继承

    我来举个例子就是父类是人,子类是教师,教授继承人,孙子类继承教授和教师,若父类有一个a,
    子类会有a,孙子类也会有父类的a,爷爷类的a,这样会导致数据冗余和二义性,导致a会被放2份。

    class Person
    
    {
    
    public:
    	string _name; // 姓名
    
    };
    
    class teacher : public Person
    
    {
    
    protected:
    	int _num; //学号
    
    };
    
    class professor : public Person
    
    
    {
    
    protected:
    	int _id; // 职工编号
    
    };
    
    class Assistant : public teacher, public professor
    
    {
    
    protected:
    	string _majorCourse; // 主修课程
    
    };
    
    void Test()
    {
    	// 这样会有二义性无法明确知道访问的是哪一个
    
    	Assistant n;
    	n._name = "peter";
    
    	// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决
    
    	n.professor::_name = "xxx";
    	n.teacher::_name = "yyy";
    }
    
    • 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
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    在这里插入图片描述

    虚继承解决菱形继承的问题
    在教师和教授继承前加个virtual,即可解决
    原理就是运用虚基表里面的虚基质指针来通过指向位置的首地址加偏移量可以找到2个量。

  • 相关阅读:
    杭电oj 2055 An easy problem C语言
    LeetCode_排序_二分搜索_双指针_中等_658.找到 K 个最接近的元素
    dva搭建项目实例
    C语言实现将一个数组逆序输出,使用指针数组操作
    C语言--文件操作详解(2)(文本文件和二进制文件,文件读取结束的判定,用函数进行文件的拷贝,文件缓冲区)
    220V转18V非隔离降压芯片:满足多种应用需求
    聊聊我认为的 “Kotlinic“
    Redis 学习笔记 3:黑马点评
    基于C++的社交应用的数据存储与实现
    基于JAVAWeb产品管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  • 原文地址:https://blog.csdn.net/qq_58397569/article/details/130895171