首页 > 编程语言 >标准C++ -- day06

标准C++ -- day06

时间:2023-08-28 18:44:39浏览次数:35  
标签:-- 子类 day06 C++ Son 继承 Base 父类 指针

一、什么是继承
  1. 当遇到问题时,先查看现有的类是否能解决一部分问题,如果有则继承该类,并在此基础上扩展以此解决问题,从而缩短解决问题的时间(代码复用)
  2. 当遇到一个大而复杂的问题时,可以把大问题拆分成若干个不同的小问题,然后为每个小问题设计一个类来解决,最后通过继承的方式把这些类汇总到一个类中,从而解决大问题,以此降低问题的难度,可以同时让多个程序员共同解决大问题
派生类去继承基类 子类继承父类
二、继承的语法
  1. 继承表
class Son : // 继承表[继承方式 父类名1,继承方式 父类名2,...]
{
    //成员变量
public:
    //成员函数
}
  1. 继承方式

    • public

    • private

    • protected

三、C++继承的特点
  1. C++中的继承可以有多个父类
  2. 子类会继承父类的所有内容,是否能用另说
  3. 子类对象可以向它的父类类型转换(缩小),但是父类对象不能向子类类型转换(放大)
    Base* b = new Son;// true
    Base& b = son;    // true
    Son* s = new base;// false
    Son& s = base;    // false
    // 父类指针或引用可以指向子类对象,子类指针或引用不能指向父类对象
    
  4. 子类会隐藏父类的同名成员(成员变量、成员函数),不构成函数重载,因为作用域不同
    同名成员被隐藏后,在子类中直接访问到的是子类的同名成员
    但可以通过 父类名 :: 同名成员名 的方式指定访问父类同名成员
  5. 在执行子类构造函数的初始化列表时,会按照继承表的顺序来执行父类的构造函数,默认执行的是父类的无参构造,但也可以在子类的初始化列表中显式地调用父类的有参构造,然后再执行类类型成员的构造函数,最后执行子类的构造函数
    Son(int num){}                // 调用Base的无参构造
    Son(int num):Base(val)
    {}      // 调用Base的有参构造
    
  6. 在子类的析构函数执行结束后,再调用类类成员的析构函数,最后按照继承表的逆序调用父类的析构函数
  7. 当子类执行拷贝构造时,默认下只会调用父类的无参构造,但是这是有问题的,因此需要在子类的拷贝函数的初始化列表中显式地调用父类的拷贝构造函数
    Son(const Son& thar):Base(that) // 调用Base的拷贝构造
    {}    
    // 父类引用可以指向子类对象
    
  8. 当子类执行赋值函数时,默认下不会调用父类的赋值函数,如果需要调用父类的赋值函数,可以在子类的赋值操作中通过域限定符显式地调用父类的赋值操作
    Son& operator=(const Son& that)
    {
        Base::operator=(that); // 调用Base的赋值操作
    }
    
四、继承方式与访问控制属性
  1. 访问控制属性对成员的访问范围限制:

    public 可以在任意位置访问
    protected 只能在类内和子类中访问
    private 只能在类内访问

  2. 继承方式的影响
    • 父类的成员是否能直接在子类中访问,取决于父类中的访问控制属性,不受子类的继承方式影响

    • 子类的继承方式能决定父类成员被子类继承后,在子类中变成什么样的访问控制属性

    父类中的属性 public继承 protected继承 private继承
    public public protected private
    protected protected protected private
    private private private private
  3. 只有以public方式继承父类,父类的指针或引用才能指向子类对象,这也是多态的基础
五、多重继承和钻石(菱形)继承
  1. 多重继承
    • 当一个子类继承多个父类时,此时称为多重继承,会按照继承表的顺序在子类中排列父类的内容,当使用父类指针指向子类对象,编译器会自动计算出该父类的内容在子类中的位置,并让父类指针指向该位置,所有可能会出现使用同一个子类指针给不同的父类指针赋值后,地址编号不同的情况
  2. 钻石继承,菱形继承
    • 假设有一个类A,类B和类C都分别继承了类A,又有类D继承了类B、类C,一个类的父类有共同祖先时,形成了钻石(菱形)继承

    • 问题:

      • 类B、类C各自都有类A的内容

      • 类D会继承类B、类C的所有内容,就导致类D中继承了两份类A的内容

      • 当类D对象去访问类A的内容时,编译器不能确定访问的是哪份类A的内容,有歧义,会报错

  3. 虚继承
    • 使用 virtual关键字 去修饰继承表时,此时变成虚继承

    • 此时子类中会多出一个成员变量:虚指针,该指针会指向父类的内容,并且当该子类被继承时该虚指针会一起被继承,如果此时形成钻石继承时,孙子类中就会有多个指向相同位置的虚指针,此时编译器会比较这些虚指针指向的内容是否一致,如果是则只继承一份

    • 通过虚继承可以解决钻石继承中的访问共同祖先类内容会有歧义的问题

标签:--,子类,day06,C++,Son,继承,Base,父类,指针
From: https://www.cnblogs.com/bigflyny/p/17663148.html

相关文章

  • 全连接下的FR网络配置
     网络配置: 验证网络互通: ......
  • Python Tornado实现WebSocket通讯
    以下实例有点像广播通讯,支持多个客户端连接代码参考别人的,稍微做了一点点修改服务器端websocket_demo.py #-*-coding:utf-8-*-from__future__importunicode_literals,print_functionfromdatetimeimportdatetimeimportosimporttornadofromtornado.opti......
  • python3.8以及更高版本 编译pcl
    github https://github.com/strawlab/python-pcl1.安装Cython当前的Cython的版本如下 由于python-pcl代码仓已经是很老的代码了,没有人在维护,高版本的Cython会导致编译失败报错如下Cython.Compiler.Errors.CompileError:pcl/_pcl_180.pyx 使用Cython==0.29版本即可解决......
  • 阿里云 X 森马 AIGC T 恤设计大赛开启!穿什么由你定,赢 Airpods,作品定制联名T恤
    “关于宇宙,我所知道的最富诗意的事实之一就是,我们身体中的每一个原子都曾经存在于某一颗爆发的恒星里。组成你左手的原子和组成你右手的原子很有可能来自不同的恒星,而我们都是恒星的孩子,我们的身体是由星尘组成的。”——物理学家劳伦斯·克劳斯出自:《无中生有的宇宙》AIGC热潮......
  • 【C++STL基础入门】vector运算和遍历、排序、乱序算法
    @TOC前言C++标准库提供了丰富的容器和算法,其中vector是最常用的容器之一。它以动态数组的形式存储元素,并提供了许多方便的运算符和算法来操作和处理数据。本文将介绍vector的基本运算、遍历方法、排序算法以及乱序算法。通过学习这些内容,您将能够更加灵活、高效地使用vector容器。......
  • XtrBackup8.0备份
    安装wgethttps://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.23-16/binary/tarball/percona-xtrabackup-8.0.23-16-Linux-x86_64.glibc2.17.tar.gztarxfpercona-xtrabackup-8.0.23-16-Linux-x86_64.glibc2.17.tar.gz/bin/xbcloud......
  • 如何建设跨境电商独立站(跨境电商独立站建设步骤)
    现如今,电商行业在飞速发展,而跨境电商这个市场也成为香饽饽,受到企业以及个人商家的青睐。那么如何建设一个成功的跨境电商独立站呢?接下来广州名锐讯动带大家一起了解跨境电商独立站建设的步骤。第一步:市场调研与定位在建设跨境电商独立站之前,首先要进行充分的市场调研和定位。了解目......
  • Lnton羚通视频算法算力云平台关于pandas 处理什么样的数据?
    pandas数据表格的表示 想存储一些 Titanic 乘客数据,知道姓名,年龄,性别等;df=pd.DataFrame({"Name":["Braund,Mr.OwenHarris","Allen,Mr.WilliamHenry","Bonnell,Miss.Elizabeth",......
  • 签到小程序开发如何保证数据安全性?
    在日常生活中我们可能会接触到一些签到小程序,比如活动签到,上班打卡等。那么随之而来的就是数据的安全性问题。接下来,广州名锐讯动将针对签到小程序开发如何保证数据安全性这个问题总结了一些有效的方法和措施。1. 用户身份验证:签到小程序开发中为了防止未经授权的访问和操纵,我们要......
  • 微商城小程序开发如何提高用户留存率?
    微商城小程序作为电商行业的一份子,让用户能够方便地浏览和购买各类商品。对于商家来说保持长期盈利和稳定增长的关键就是用户的留存率。那么,微商城小程序开发如何提高用户留存率?下面,让广州名锐讯动为大家娓娓道来。1.优化用户体验微商城小程序的用户体验是直接影响用户留存率的因......