c++--多态

1.多态概念

多态是C++面面向对象的三大特性之一,多态需要在继承状态下完成,多态的特性就是面对相同的事情,需要不同的处理,产生不同的结果。

2.多态的条件及实现

多态是在不同的继承关系里,去实现函数名相同的不同实现方法,

在继承中实现多态需要两个条件:

  • 必须通过基类的指针或引用来调用虚函数;
  • 被调用的必须是虚函数,且派生类必须对基类的虚函数进行重写。

虚函数:

即在virtual修饰下的类成员函数称为虚函数

class Person {
public:
virtual void BuyTicket() { cout << "买票-全价" << endl;}
};

虚函数重写:

虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

虚函数重写特列:

1. 协变(基类与派生类虚函数返回值类型不同)
        派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。

2.析构函数的重写(基类与派生类析构函数的名字不同)
        如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。

C++11 override 和 final
从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此:C++11提供了override和final两个关键字,可以帮助用户检测是否重写。

多态实现:

class Person {
public:virtual void BuyTicket() { cout << "买票-全价" << endl; }virtual void Fun1() { cout << "Person::Fun1()" << endl; }virtual void Fun2() { cout << "person::Fun2()" << endl; }virtual void Fun3() final{ cout << "person::Fun3()" << endl; }//不能被重写virtual void Fun4()  { cout << "person::Fun4()" << endl; }
};
class Student : public Person {
public://virtual void BuyTicket() { cout << "买票-半价" << endl; }/*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用*/void BuyTicket() { cout << "买票-半价" << endl; }virtual void Fun1() { cout << "student::Fun1()" << endl; }virtual void Fun2() { cout << "student::Fun2()" << endl; }//virtual void Fun3() final { cout << "student::Fun3()" << endl; }virtual void Fun4() override{ cout << "student::Fun4()" << endl; }//virtual void Fun4(int x) override //{ cout << "student::Fun4()" << endl; }//报错//override检查是否重写,没有重写则报错
};int main()
{Person ps;Student st;ps.BuyTicket();ps.Fun1();ps.Fun2();ps.Fun3();ps.Fun4();cout << endl;st.BuyTicket();st.Fun1();st.Fun2();st.Fun3();st.Fun4();/*Func(ps);Func(st);*/return 0;
}

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

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

相关文章

【论文阅读】DEPIMPACT:反向传播系统依赖对攻击调查的影响(USENIX-2022)

Fang P, Gao P, Liu C, et al. Back-Propagating System Dependency Impact for Attack Investigation[C]//31st USENIX Security Symposium (USENIX Security 22). 2022: 2461-2478. 攻击调查、关键边、入口点 开源&#xff1a;GitHub - usenixsub/DepImpact 目录 1. 摘要2. 引…

前端学习——ajax (Day3)

AJAX原理 - XMLHttpRequest 使用 XMLHttpRequest <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

消息队列(一)-- RabbitMQ入门(1)

初识 RabbitMQ 核心思想&#xff1a;接收并转发消息。可以把它想象成一个邮局。 producer&#xff1a;生产者 queue&#xff1a;队列 consumer&#xff1a;消费者什么是消息队列 MQ&#xff08;Message Queue&#xff09;&#xff1a;本质是队列&#xff0c;FIFO先入先出&…

【【直流电机驱动PWN】】

直流电机驱动PWN 前面都是沙县小吃&#xff0c;这里才是满汉全席 直流电机是一种电能转化成机械能的装置 直流电机有两个电极 当电机正接 电机正转 当电机负接 电机倒转 电机还有步进电机 舵机 无刷电机 空心杯电机 因为电机是一个大功率器件并不太好直接接在IO端口上所以我…

设备模块调用整合指南

描述 不依赖其它事件管理器,直接引入js,全局事件方法(设备对象名+事件名)处理 #1、引入相关js <script src="./utils/lodash.min.js"></script><script src="config/config.js"></script><script src="./plugins/pl…

脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)

目录 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 1.2 经典的ERPs成分及研究 1.2.1 ERPs命名规则及分类 1.2.2 常见的脑电成分 1.2.3 P300及Oddball范式 1.2.4 N400成分 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 EEG(Electroencephalogram)&#x…

【Mysql数据库面试01】内连接 左连接 右连接 全连接

【Mysql数据库】内连接 左连接 右连接 全连接 0.准备1.内连接1.1 SQL(不带where)1.2 SQL&#xff08;带where&#xff09;1.3总结 2.左连接2.1SQL&#xff08;不带where&#xff09;2.2SQL&#xff08;带where&#xff09;2.3总结 3.右连接3.1 SQL&#xff08;不带where&#x…

CVPR2023新作:基于面部对称性先验的三维生成对抗网络反演方法

Title: 3D GAN Inversion With Facial Symmetry Prior (带面部对称性先验的3D GAN反演) Affiliation: 清华大学 Authors: Fei Yin, Yong Zhang, Xuan Wang, Tengfei Wang, Xiaoyu Li, Yuan Gong, Yanbo Fan, Xiaodong Cun, Ying Shan, Cengiz Oztireli, Yujiu Yang Keywords…

GDAL C++ API 学习之路 (6) OGRGeometry 几何类 OGRGeometry

Simplify virtual OGRGeometry *Simplify(double dTolerance) const 简化几何图形 参数: dTolerance -- 简化的距离容差。 返回: 简化的几何图形或 NULL&#xff08;如果发生错误&#xff09; // 创建一个多边形对象OGRLinearRing ring;ring.addPoint(0, 0);ring.addPoint…

CNN复习

个人的对于CNN总结的一些知识点 对于每一个卷积层来说&#xff0c;其out_channel就是卷积核的个数&#xff1a; 对每个输入的图片&#xff08;就是每一个&#xff08;C,H,W&#xff09;的矩阵&#xff0c;一共有batch_size个&#xff09;&#xff0c;卷积核从第0到第in_channe…

表单验证:输入的字符串以回车分隔并验证是否有

公司项目开发时&#xff0c;有一个需求&#xff0c;需要对输入的字符串按回车分隔并验证是否有重复项&#xff0c;效果如下&#xff1a; 表单代码&#xff1a; <el-form-item label"IP地址条目&#xff1a;" prop"ipAddressEntry"><el-inputtype&…

Vue中TodoList案例_静态

MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认"></div> </template><script> export default {name: "MyHeader"…

Vue 中input 点击复制其内容

Element UI中el-input 组件 &#xff0c;一般使用情况&#xff1a; <el-input type"text" id"put" v-model"value" ></el-input> el-input 添加点击事件,这样添加点击事件是无效的&#xff1a; <el-input click"copy&quo…

Linux Shell 脚本编程学习之【第3章 正则表达式 (第一部分)】

第3章 正则表达式 1 正则表达式基础1.1 *符号1.2 “.”符号1.3 “^”符号1.4 “$”符号1.5 “[]”符号1.6 “\”符号1.7 “\<\>”符号1.8 “\{\}”符号 2 正则表达式扩展2.1 “?”符号2.2 “”符号2.3“()”符合和“ | ”符号 3 通配&#xff08;Globbing&#xff09; 1…

生产环境Session解决方案、Session服务器之Redis

目录 一、服务器配置 二、安装nginx 三、安装配置Tomcat&#xff1a; 四、配置session Session服务器之Redis Redis与Memcached的区别 安装部署redis 一、服务器配置 IP地址 主机名 软件包列表 192.168.100.131 huyang1 nginx 192.168.100.133 huyang3 JDK Tomca…

微信小程序上,实现图片右上角数字显示

微信小程序上&#xff0c;实现图片右上角数字显示 直接上代码&#xff1a; 样式代码index.wxss如下&#xff1a; .circle_rednum {position: absolute;color: white;font-size: 13px;background-color: #EC2F43;width: 23px;height: 23px;line-height: 23px;left: 80%;top: …

【docker】docker部署tomcat

目录 1.1 搜索tomcat镜像1.2 拉取tomcat镜像1.3 创建容器&#xff0c;设置端口映射、目录映射1.4 测试 1.1 搜索tomcat镜像 docker search tomcat1.2 拉取tomcat镜像 docker pull tomcat1.3 创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建tomcat目录用于存…

数据库备份还原-mysqldump、mydumper、xtrabackup、压缩

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 一、创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARC…

Linux中常用的指令

ls ls [选项] [目录或文件] 功能&#xff1a;对于目录&#xff0c;列出该目录下所有的子目录和文件&#xff1b;对于文件&#xff0c;列出该文件的文件名和其他属性 常用选项&#xff1a; -a:列出目录下的所有文件&#xff0c;包括以.开头的隐藏文件 -l:列出文件的详细信息。…

单片机第一季:零基础11——实时时钟DS1302

目录 1&#xff0c;DS1302 时钟芯片介绍 2&#xff0c;BCD码介绍 3&#xff0c;涉及到的寄存器 3.1&#xff0c;控制寄存器 3.2&#xff0c;日历/时钟寄存器 3.3&#xff0c;DS1302 的读写时序 4&#xff0c;相关代码 这一章我们来学习DS1302 时钟芯片&#xff0c…