• C++: 继承


    继承:是代码复用的一种手段, 可以在基类上进行拓展

    使用:

    1. class Person
    2. {
    3. int age;
    4. string name;
    5. };
    6. // 派生类 继承方式 基类
    7. class Student: public Person
    8. {
    9. int id;
    10. };

    继承的赋值兼容规则(切割)

    • 切片: 派生类对象可以直接赋值给基类对象
    • 基类对象不能赋值给派生类对象
    • 基类的指针,引用可以通过强转赋值给派生类的指针或引用(但必须基类的指针指向派生类对象,不然可能会产生越界)

    继承的作用域(隐藏)

    • 基类有基类的作用域, 派生类有派生类的作用域
    • 重定义(隐藏):子类成员屏蔽父类对同名成员的访问.(前提:不同作用域的同名函数), 但其仍在子类中,可以通过 基类:: 成员 显示的访问
      • 成员函数只要函数名相同就构成隐藏

    继承中的默认成员函数

    • 派生类中所包含的基类成员, 需要调用基类的构造,拷贝,赋值,析构
    • 构造函数: 调用基类的构造函数, 完成基类的初始化
      • 若基类没有默认构造函数, 在派生类的构造函数的初始化列表中,显示调用
    • 拷贝构造: 调用基类的拷贝构造, 完成基类的拷贝
    • 赋值:调用基类的赋值, 完成基类的赋值
    • 析构: 在调用完派生类的析构后, 自动调用基类的析构
      • 一些场景下,析构函数需要重写, 编译器析构函数名特殊处理: destrutor(), 所以父类的析构不加virtual的情况下, 与子类构成隐藏

    继承的种类

    • 单继承 : 同上
    • 多继承
    1. class A{
    2. int a;
    3. };
    4. class B{
    5. int b;
    6. };
    7. class C: public A, public C{
    8. int c;
    9. };

    • 菱形继承
    1. class A{
    2. int a;
    3. };
    4. class B : public A{
    5. int b;
    6. };
    7. class C : public A{
    8. int c;
    9. };
    10. class D : public B, public C{
    11. int d;
    12. };
    •  导致的问题: 二意性,  数据冗余

    •  解决:虚继承(虚基表): 通过指针, 指向了虚基表, 虚基表中存了偏移量能找到A
      • 继承的时候加上virtual就行
    1. class A{
    2. int a;
    3. };
    4. class B : virtual public A{
    5. int b;
    6. };
    7. class C : virtual public A{
    8. int c;
    9. };
    10. class D : public B, public C{
    11. int d;
    12. };

    • 继承与友元
      • 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员

    • 继承与静态成员
      • 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。

  • 相关阅读:
    2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用?
    使用构建缓存优化 Docker 镜像构建
    java数据结构与算法刷题-----LeetCode101:对称二叉树
    腾讯云轻量数据库1核1G评测和租用价格表
    猿创征文|【深度学习前沿应用】文本生成
    C语言实现八大排序
    获取当天年月日,及开始结束时间
    [详细]Apache Shiro身份验证越权漏洞[CVE-2016-6802][CVE-2020-1957]
    ISO体系认证办理流程
    依赖项安全检测新利器:Scorecard API
  • 原文地址:https://blog.csdn.net/m0_70402487/article/details/133777942