博客
关于我
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/

你可能感兴趣的文章
redis事务操作
查看>>
PHP中array_merge和array相加的区别分析
查看>>
PHP中dirname(__FILE__)的意思
查看>>
PHP中extract()函数的妙用
查看>>
PHP中implode()和explode()
查看>>
PHP中serialize和json序列化与反序列化的区别
查看>>
Redis事务处理
查看>>
php中使用ajax进行前后端json数据交互
查看>>
Redis事务和锁操作
查看>>
php中引入文件几种方式的区别
查看>>
PHP中把stdClass Object转array的几个方法
查看>>
PHP中替换换行符
查看>>
PHP中有关正则表达式的函数集锦
查看>>
Redis 集群搭建详细指南
查看>>
php中的cookie用法
查看>>
php中的session用法
查看>>
php中级联,php实现三级级联下拉框_PHP
查看>>
PHP中获取星期的几种方法
查看>>
Redis 限速器及问题
查看>>
php中高级基础知识点
查看>>