博客
关于我
C++派生类和重载赋值运算符以及和复制构造函数的调用运行逻辑实例
阅读量:238 次
发布时间:2019-03-01

本文共 839 字,大约阅读时间需要 2 分钟。

C++ 中的派生类(Derived Class)继承自基类(Base Class),并且在基类中定义了赋值运算符(operator=),这样当派生类对象进行赋值时,会调用基类中的赋值方法。这种机制确保了即使派生类有自己的成员,赋值操作仍能按照预期工作。

在本例中,CBase 是一个基类,定义了一个默认构造函数和一个复制构造函数。它的 operator= 方法允许将一个 CBase 对象赋值给另一个 CBase 对象。CDerivedCBase 的派生类,定义了自己的构造函数和复制构造函数。

当使用 d2 = d1 时,由于 CDerived 中没有定义 operator=, 所以会调用 CBase 中的 operator=, 这会将 d1 中的 a 值赋值给 d2。然而,这种方式可能无法正确处理 CDerived 类中的新成员 b,因为基类的赋值操作只处理已知的成员。

为了确保 CDerived 对象的完整赋值,通常需要在派生类中定义 operator=。如果派生类中没有定义 operator=, 基类的赋值方法会被调用,但这可能导致仅部分成员被赋值,或者未处理派生类特有的成员。

例如,在本例中,如果 CDerived 有自己的成员 b,并且在 operator= 中没有正确处理 b,那么 d2 = d1 可能只赋值 a 而忽略 b。因此,正确的做法是定义派生类的 operator= 来处理所有成员的赋值,确保所有成员都被正确复制。

此外,复制构造函数(copy constructor)用于在派生类中初始化对象,通常用于避免深拷贝带来的内存泄漏。例如,CDerived d3(d2); 会调用 CBase 的复制构造函数,这会先初始化基类成员 a,然后派生类会处理 b

总结来说,派生类在赋值时,使用基类的 operator= 会导致基类成员被赋值,但派生类特有的成员可能需要在派生类的 operator= 中进行处理,以确保所有成员都被正确处理。

转载地址:http://wszt.baihongyu.com/

你可能感兴趣的文章
pip 升级报错AttributeError: ‘NoneType’ object has no attribute ‘bytes’
查看>>
pip 安装opencv-python卡死
查看>>
pip 安装出现异常
查看>>
Pip 安装失败:需要 SSL
查看>>
Pip 安装挂起
查看>>
pip 或 pip3 为 Python 3 安装包?
查看>>
pip 文件损坏导致 pip无法使用 报错 ImportError: cannot import name 'main' from 'pip._int
查看>>
pip 无法从 requirements.txt 安装软件包
查看>>
pip/pip3更换国内源
查看>>
pip3 install PyQt5 --user 失败
查看>>
pip3命令全解析:Python3包管理工具的详细使用指南
查看>>
pip3安装命令重复创建文件‘/tmp/pip-install-xxxxx/package‘失败
查看>>
PIPE 接口信号列表
查看>>
pipeline配置与管理Job企业级实战
查看>>
pipeline项目配置实战
查看>>
Pipenv 与 Conda?
查看>>
QVGA/HVGA/WVGA/FWVGA分辨率屏含义及大小//Android虚拟机分辨率
查看>>
pipreqs : 无法将“pipreqs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。
查看>>
pipy国内镜像的网址
查看>>
quiver绘制python语言
查看>>