C++ 继承 派生类的运算符重载

  • C++(二十二)派生类的运算符重载
    • 语法
    • 赋值顺序
    • 引例1:当子类,不自实现赋值运算符函数重载时,默认调用父类的赋值运算符函数
    • 引例2:子类自实现赋值运算符函数重载,不做特殊处理时,只会调用父类的赋值运算符函数.
    • 引例3:子类自实现赋值运算符函数重载,在函数体内调用父类的赋值运算符函数.
      • 内嵌函数的赋值运算符函数
      • 案例

C++ 派生类的运算符重载

赋值运算符函数不是构造器,所以可以继承,语法上就没有构造器那么严格。

语法

子类& 子类::operator=(const 子类& another)
{父类::operator =(another); // 调用父类的赋值运算符重载...
}

赋值顺序

在这里插入图片描述

引例1:当子类,不自实现赋值运算符函数重载时,默认调用父类的赋值运算符函数


//todo 派生类运算符重载
#include <iostream>
using namespace std;class A{public:int a;A(){cout << "A()" << endl;}A & operator=(const A& other){this->a=other.a;cout << "        A & operator=(const A& other)         "  << endl;return *this;}
};class B: public A{
public:int b;B(){cout << "B()" << endl;}
};int main() {B b;B bb;b=bb;return 0;
}
输出:
A()
B()
A()
B()A & operator=(const A& other)

引例2:子类自实现赋值运算符函数重载,不做特殊处理时,只会调用父类的赋值运算符函数.

//todo 派生类运算符重载
#include <iostream>
using namespace std;class A{
public:int a;A(){cout << "A()" << endl;}A & operator=(const A& other){this->a=other.a;cout << "    A & operator=(const A& other)         "  << endl;return *this;}
};class B: public A{
public:int b;B(){cout << "B()" << endl;}B & operator=(const B& other){this->b=other.b;cout << "    B & operator=(const A& other)         "  << endl;return *this;}};int main() {B b;B bb;b=bb;return 0;
}
A()
B()
A()
B()B & operator=(const A& other)

引例3:子类自实现赋值运算符函数重载,在函数体内调用父类的赋值运算符函数.

//todo 派生类运算符重载
#include <iostream>
using namespace std;class A{
public:int a;A(int x){a=x;cout << "A()" << endl;}A & operator=(const A& other){if (this==&other){return *this;}this->a=other.a;cout << "    A & operator=(const A& other)         "  << endl;return *this;}
};class B: public A{
public:int b;B(int x, int y):A(x){b=y;cout << "B()" << endl;}B & operator=(const B& other){if (this==&other){return *this;}//显示调用基类的赋值运算符A::operator=(other);this->b=other.b;cout << "    B & operator=(const A& other)         "  << endl;return *this;}};int main() {B b(1,2);B bb(3,4);b=bb;cout << b.a << " " << b.b << endl;return 0;
}
输出:
A()
B()
A()
B()A & operator=(const A& other)B & operator=(const A& other)
3 4

内嵌函数的赋值运算符函数

//todo 派生类运算符重载
#include <iostream>
using namespace std;class C{public:int c;C(int x){c=x;cout << "C()" << endl;}C & operator=(const C& other){if (this==&other){return *this;}this->c=other.c;cout << "    C & operator=(const C& other)         "  << endl;return *this;}};class A{
public:int a;A(int x){a=x;cout << "A()" << endl;}A & operator=(const A& other){if (this==&other){return *this;}this->a=other.a;cout << "    A & operator=(const A& other)         "  << endl;return *this;}
};class B: public A{
public:C c;int b;B(int x, int y , int z):A(x),c(z){b=y;cout << "B()" << endl;}B & operator=(const B& other){if (this==&other){return *this;}//显示调用内嵌函数c=other.c;//显示调用基类的赋值运算符A::operator=(other);//赋值兼容:this->b=other.b;cout << "    B & operator=(const A& other)         "  << endl;return *this;}};int main() {B b(1,2,99);B bb(3,4,77);b=bb;cout << b.a << " " << b.b <<  " " << b.c.c <<endl;return 0;
}
输出:
A()
C()
B()
A()
C()
B()C & operator=(const C& other)A & operator=(const A& other)B & operator=(const A& other)
3 4 77

案例

# include <iostream>
using namespace std;class Birthday{
private:int year_;int month_;int day_;public:Birthday(int year=0, int month=0, int day=0): year_(year), month_(month), day_(day){}Birthday(const Birthday& other){cout<<" Birthday (const Birthday& other)"<<endl;this->year_ = other.year_;this->month_ = other.month_;this->day_ = other.day_;}Birthday & operator=(const Birthday& other){if (this==&other){return *this;}this->year_ = other.year_;this->month_ = other.month_;this->day_ = other.day_;cout << "    Birthday & operator=(const Birthday& other)         "  << endl;return *this;}void Birthdayprint(){cout <<"Birthday:"<< year_ << "/" << month_ << "/" << day_ << endl;}
};class Student{
private:string name_;char sex_;float score_;Birthday birthday_;
public:Student(string name, char sex, float score , int year, int month, int day): name_(name), sex_(sex), score_(score),birthday_(year, month, day){}Student(const Student& other):birthday_(other.birthday_){cout<<" Student (const Student& other)"<<endl;this->name_ = other.name_;this->sex_ = other.sex_;this->score_ = other.score_;}Student & operator=(const Student& other){if (this==&other){return *this;}this->name_ = other.name_;this->sex_ = other.sex_;this->score_ = other.score_;//显示调用基类的赋值运算符函数this->birthday_ = other.birthday_;cout << "    Student & operator=(const Student& other)         "  << endl;return *this;}void print(){birthday_.Birthdayprint();cout << "Name: " << name_ << endl;cout << "Sex: " << sex_ << endl;cout << "Score: " << score_ << endl;}
};class Graduate: public Student{
private:float salary_;
public:Graduate(string name, char sex, float score, float salary, int year, int month, int day):Student(name, sex, score, year,  month,  day), salary_(salary){}Graduate(const Graduate& other):Student(other){cout<<" Graduate (const Graduate& other)"<<endl;this->salary_ = other.salary_;}Graduate & operator=(const Graduate& other){if (this==&other){return *this;}//显示调用基类的赋值运算符函数Student::operator=(other);this->salary_ = other.salary_;cout << "    Graduate & operator=(const Graduate& other)         "  << endl;return *this;}void pri(){print();cout << "Salary: " << salary_ << endl;}
};class Doctor: public Graduate{
private:string title_;
public:Doctor(string name, char sex, float score, float salary, int year, int month, int day, string title): Graduate(name, sex, score, salary, year, month, day), title_(title){}Doctor(const Doctor& other):Graduate(other){cout << " Doctor (const Doctor& other)" << endl;this->title_ = other.title_;}Doctor & operator=(const Doctor& other){if (this==&other){return *this;}//显示调用基类的赋值运算符函数Graduate::operator=(other);this->title_ = other.title_;cout << "    Doctor & operator=(const Doctor& other)         "  << endl;return *this;}void Dpri(){pri();cout << "Title: " << title_ << endl;}
};int main(){Graduate g("Alice", 'F', 95.5, 5000 , 2000, 1, 1);g.pri();cout <<"==============="<< endl;Doctor d("Bob", 'M', 85.0, 4000, 2111, 1, 1, "Doctor");d.Dpri();cout <<"==============="<< endl;Doctor d2(d);d2.Dpri();cout <<"#####################"<< endl;Doctor n1("Bob", 'M', 85.0, 9900, 666, 6, 6, "Doctor");Doctor n2("sadsdw", 'G', 1111.0, 4000, 77, 7, 7, "7777");n2=n1;n2.Dpri();return 0;
}
输出:Birthday:2000/1/1
Name: Alice
Sex: F
Score: 95.5
Salary: 5000
===============
Birthday:2111/1/1
Name: Bob
Sex: M
Score: 85
Salary: 4000
Title: Doctor
===============Birthday (const Birthday& other)Student (const Student& other)Graduate (const Graduate& other)Doctor (const Doctor& other)
Birthday:2111/1/1
Name: Bob
Sex: M
Score: 85
Salary: 4000
Title: Doctor
#####################Birthday & operator=(const Birthday& other)Student & operator=(const Student& other)Graduate & operator=(const Graduate& other)Doctor & operator=(const Doctor& other)
Birthday:666/6/6
Name: Bob
Sex: M
Score: 85
Salary: 9900
Title: Doctor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391879.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode】平衡二叉树、对称二叉树、二叉树的层序遍历(广度优先遍历)(详解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

【Qt】如何搭建Qt开发环境

Qt的开发工具 需要搭建Qt开发环境&#xff0c;需要安装3个部分&#xff1a; C编译器&#xff08;gcc、cl.exe...&#xff09;注意&#xff0c;这里的C编译器不是指visual studio这种集成开发环境&#xff0c;编译器不等于IDE&#xff0c;编译器只是IDE调用的一个程序。Qt SDK…

将本地的业务写成成可供RPC远程调用的方法

第一步&#xff1a;首先我们先定义proto文件&#xff0c;这些proto文件将会为远程调用者提供调用的方法&#xff0c;为login方法。 2.重写UserServiceRpc类中的Login方法。 在Login中做的操作主要是&#xff0c;得到requst里面的参数&#xff0c;然后调用本地的Login方法&#…

SQL注入 报错注入、文件上传、布尔盲注、时间盲注

第7关 文件上传 ---面试官常问 1、MySQL上传shell的满足条件 如果面试官问你如何通过MySQL向网站上传一个shell脚本或者其他语言的一些脚本 ---就可以通过outfile导出的方式进行上传&#xff1b; outfile导出的前提条件&#xff1a;1、必须知道网站的物理路径&#xf…

网络编程相关

关于ipv4和v6 ipv4小细节-------公网和私有地址 端口 InetAddress 协议 UDP、TCP UDP通信程序 发送&#xff08;单播&#xff09;&#xff1a; 接收&#xff08;单播&#xff09;&#xff1a; UDP三种通信方式 单播和广播代码几乎相同&#xff0c;就是将&#xff1a; InetAddr…

【JVM基础11】——垃圾回收-说一下JVM的分代回收?

目录 1- 引言&#xff1a;分代回收1-1 什么是分代回收&#xff08;What&#xff09;1-2 为什么要用分代回收&#xff1f;&#xff08;Why&#xff09; 2- ⭐核心&#xff1a;分代回收工作机制2-1 工作机制2-2 MinorGC、Mixed GC、FullGC的区别是什么 3- 总结3-1 说一下 JVM 的分…

如何利用 ChatGPT 提高工作效率?

内容创作与总结&#xff1a; 写作辅助&#xff1a;可以帮助撰写文章、报告、邮件等各种文本&#xff0c;如为招商银行写宣传文案、写论文、写故事等。学习材料生成&#xff1a;能够生成学习材料&#xff0c;如摘要、抽认卡和测验&#xff0c;帮助学生复习和学习课程。评估和考核…

【Material-UI】深入理解useAutocomplete Hook:自定义与高级用法

文章目录 一、什么是useAutocomplete&#xff1f;导入useAutocomplete 二、基本用法代码解析 三、高级定制1. 自定义选项渲染2. 分组和排序3. 自定义输入框行为4. 与其他组件集成 四、注意事项1. 类型安全2. 性能优化 五、总结 Material-UI提供了强大的Autocomplete组件&#x…

Android 本地化、多语言切换:Localization

目录 1&#xff09;如何实现多语言切换、如何实现跟随手机语言切换而切换app语言 2&#xff09;Localization是什么 3&#xff09;不管手机语言如何&#xff0c;根据用户在App选择的语言&#xff0c;只切换App语言 4&#xff09;文字长短不一样&#xff0c;怎么办呢? 一、Lo…

Java面试之操作系统

1、冯诺依曼模型 运算器、控制器、存储器、输入设备、输出设备 32位和64位CPU最主要区别是一次性能计算多少字节数据&#xff0c;如果计算的数额不超过 32 位数字的情况下&#xff0c;32 位和 64 位 CPU 之间没什么区别的&#xff0c;只有当计算超过 32 位数字的情况下&#…

我花了一天时间,搭了个专属知识库,部署上线了,手把手教,不信你学不会

自动开了这个号以后&#xff0c;陆陆续续写了很多干货文章&#xff0c;一方面是可以帮助自己梳理思路&#xff0c;另一方面也方便日后查找相关内容。 但是&#xff0c;我想检索某个关键词是在之前哪篇文章写过的&#xff0c;就有点捉急了。CSDN 还好&#xff0c;可以检索到相关…

魔塔社区程序的`datasets.utils`导入`_datasets_server`错误问题的解决办法

运行魔塔社区的的一个识别图像文件中文字的模型程序&#xff1a; 出现如下的错误提示&#xff1a; from datasets.utils import _datasets_server,file_utils ImportError: cannot import name _datasets_server from datasets.utils (D:\PycharmProjects\minicpm_cuda_test\ve…

【保姆级讲解C语言中的运算符的优先级!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Java-文件操作和IO

文件介绍 文件本身有多重含义,狭义的文件,特指硬盘上的文件(以及保存文件的目录),广义的文件:计算机上的很多硬件设备,软件资源,在操作系统中,都会被视为是"文件" 文件除了有数据内容之外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息可以称作文件的元信…

【Android】通知的使用

使用通知 通知&#xff08;notification&#xff09;是Android系统中比较有特色的一个功能&#xff0c;当某个应用程序希望向用户发出一些提示信息&#xff0c;而该应用程序又不在前台运行时&#xff0c;就可以借助通知来实现。发出一条通知后&#xff0c;手机最上方的状态栏中…

YOLO:VOC格式数据集转换为YOLO数据集格式

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何将目标检测中常用的VOC格式数据集转换为YOLO数据集&#xff0c;并进行数据集比例划分&#xff0c;从而方便的进行YOLO目标检测。 文章目录 一、将VOC格式数据集转换为YOLO格式数据集二、YOLO格式数据集划分&#xff08;训练、验…

FreeRTOS中的动态内存管理(heap_1、heap_2、heap_3、heap_4)

FreeRTOS 提供了多种动态内存分配方案&#xff0c;这些方案通过不同的内存管理器&#xff08;heap managers&#xff09;实现&#xff0c;主要位于 FreeRTOS/Source/portable/MemMang 目录下。以下是几种常见的动态内存分配方案&#xff1a; heap_1 特点&#xff1a; 简单性…

电脑添加虚拟网卡与ensp互联,互访

一、按照过程 1、打开设备管理器 2、点击网络适配器&#xff0c;点击左上角操作&#xff0c;点击“添加过时硬件” 3、下一页 4、选择“安装我手动从列表选择的硬件”&#xff0c;下一页 5、下拉&#xff0c;选择“网络适配器”&#xff0c;下一页 6、厂商选择“Microsoft”&…

内网穿透--LCX+portmap转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网 无法直接访问内部web服务器主机&#xff0c;通过内网其它主机做代理&#xff0c;穿透访问内网web 服务器主机 实验设备 1. 路由器、交换机各一台 2. 外网 kali 一台&…

设计测试用例的具体方法

一.等价类 等价类分为: 1.有效等价类 [6~15] 2.无效等价类 :小于6位,大于15位(不在数据范围内) 组合规则: 有效等价类组合的时候,尽可能一条测试用例尽可能多的覆盖有效等价类 无效等价类组合的时候,一条测试点,之恶能覆盖一个无效等价类 二.边界值 1.上点,离点,内点 上…