码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 继承(二) —— 基类和派生类对象的赋值转换


    当我们把一个派生类对象赋值给基类的时候,会发生赋值转换,注意,这不是强制类型转换,而是C++原本就支持的,我们把这个赋值转换过程称为“切片”。


            目录

    1、认识切片

    2、切片的实现方式

    (1) 对象赋值

    (2) 指针赋值

    (3) 引用赋值

    3、切片的应用场景(子类初始化)

    4、切片与强制类型转换的区别


    1、认识切片

    假设 Person 类和 Student 有着继承关系。

    1. class Person
    2. {
    3. protected :
    4. string _name; // 姓名
    5. string _sex; // 性别
    6. int _age; // 年龄
    7. };
    8. class Student : public Person
    9. {
    10. public :
    11. int _No ; // 学号
    12. };

    Student类 继承了 Person 类以后就会变成下面这样

    现在我们要把Student类的对象赋值给 Person类,但是Student类的成员要比 Person 类更多,多出来的成员无法赋给Person类,此时就会直接丢弃。此时会调用父类的 operator=()函数来对成员进行一一赋值。

    2、切片的实现方式

    (1) 对象赋值

    实现方式如下:

    只能是子类赋给父类,父类的成员一般要比子类少,所以父类无法赋给子类。赋值的时候,为了初始化父类的成员,会调用父类的 operator=() 函数 

    (2) 指针赋值

    实现方式如下:

    其实就是让一个父类的指针 去指向  子类继承父类的那块空间。

    (3) 引用赋值

    引用的底层使用的还是指针,所以达到的效果和指针赋值是一样的。

    3、切片的应用场景(子类初始化)

    子类在继承父类以后,不光要给自己特有的成员初始化,也要对父类的成员初始化,此时就可以利用切片的特性,将子类对象直接赋给父类。

    1. class Student : public Person
    2. {
    3. public:
    4. Student(int No, string name, string sex, int age)
    5. :_No(No),
    6. Person(name, sex, age) // 使用有参构造创建一个临时对象,然后使用这个临时对象去初始化父类
    7. {}
    8. Student(Student& s)
    9. :_No(s._No), // 给子类成员变量初始化
    10. Person(s) // Person()是一个匿名对象,
    11. // 将Student的对象s赋值给Person类的匿名对象时会发生切片
    12. {}
    13. int _No; // 学号
    14. };

    在进行切片以后,剩下的只有父类成员,此时就会自动去调用父类的拷贝构造函数来对父类成员初始化,这个内容在后面介绍子类的默认构造函数还会提到。

    4、切片与强制类型转换的区别

    强制类型转换的本质是先将右值强转以后赋给一个临时变量,临时变量具有常性,然后再将临时变量赋给左值。

    而切片是将子类多余的部分切除,然后再给父类,这个过程是C++语法天然支持的,不存在强制转换的过程。

  • 相关阅读:
    微服务:Eureka原理实践:@EnableEurekaServer、@LoadBalanced
    基于低代码平台实现的内外OA协同办公系统
    不同VLAN间的通信原理
    容器运行elasticsearch安装ik分词非root权限安装报错问题
    基本排序算法
    基于三相坐标系状态方程的感应电动机起动动态计算matlab程序
    v-if 和 v-for 为什么不建议一起使用 ?
    Windows与网络基础-14-NTFS权限规则
    vue项目实现table表格竖向
    【Python机器学习】零基础掌握SimpleImputer缺失值填充
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/127710879
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号