面试必备:C++ 多态 (附:多态重载重写区别)

多态

多态:多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式。在基类的函数前加上 virtual 关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
实现方法:多态是通过虚函数实现的,虚函数的地址保存在虚函数表中,虚函数表的地址保存在含有虚函数的类的实例对象的内存空间中。
实例
基类 Shape 被派生为两个类

#include <iostream> 
using namespace std;class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}int area(){cout << "Parent class area :" <<endl;return 0;}
};
class Rectangle: public Shape{public:Rectangle( int a=0, int b=0):Shape(a, b) { }//构造函数int area (){ cout << "Rectangle class area :" <<endl;return (width * height); }
};
class Triangle: public Shape{public:Triangle( int a=0, int b=0):Shape(a, b) { }int area (){ cout << "Triangle class area :" <<endl;return (width * height / 2); }
};
// 程序的主函数
int main( )
{Shape *shape;Rectangle rec(10,7);Triangle  tri(10,5);// 存储矩形的地址shape = &rec;// 调用矩形的求面积函数 areashape->area();// 存储三角形的地址shape = &tri;// 调用三角形的求面积函数 areashape->area();return 0;
}

运行结果:

Parent class area :
Parent class area :

导致输出与预期结果不一致的原因,当调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。
修改
在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:

class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area(){cout << "Parent class area :" <<endl;return 0;}
};

修改后运行结果

Rectangle class area :
Triangle class area :

虚函数

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定

纯虚函数

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

我们可以把基类中的虚函数 area() 改写如下:

class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0;
};

= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数

重载,继承,重写和多态的区别

1.继承是子类获得父类的成员,

2.重写是继承后重新实现父类的方法。(也需要用到虚函数)

3.重载是在一个类里一系列参数不同名字相同的方法。

4.多态则是为了避免在父类里大量重载引起代码臃肿且难于维护。

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

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

相关文章

打造明厨亮灶工程,需要哪些AI视频智能算法助力?

旭帆科技AI智能监控可以通过摄像头、传感器和数据处理等技术手段&#xff0c;实时监测厨房人员着装、行为与烟火等&#xff0c;对厨房实时监控进行分析与记录&#xff0c;从而实现明厨亮灶场景的搭建&#xff0c;保障食品安全和服务质量。 1、烟火识别 对于后厨来说&#xff0…

字符串函数的模拟实现(部分字符串函数)

strlen函数模拟 size_t my_strlen(const char* arr) {int count 0;while(*arr){arr;count;}return count;} int main() { printf( " %zd", my_strlen("adsshadsa"));}//模拟实现strlen函数 strcpy函数模拟 char* my_strcpy(char* arr1, const char* ar…

在Windows上使用 Python

本文档旨在概述在 Microsoft Windows 上使用 Python 时应了解的特定于 Windows 的行为。 与大多数UNIX系统和服务不同&#xff0c;Windows系统没有预安装Python。多年来CPython 团队已经编译了每一个 发行版 的Windows安装程序&#xff08;MSI 包&#xff09;&#xff0c;已便…

C++——C++11(2)

我在我的C异常博客中曾提到&#xff0c;对于异常的处理经常会导致内存泄漏问题&#xff0c; 一种解决方法是异常的重新抛出&#xff0c;还有一种就是RAII&#xff0c;那么RAII的思想体现 在C中就是智能指针&#xff0c;所以接下来我将简单的介绍&#xff0c;什么是RAII&#xf…

计算机网络 网络层下 | IPv6 路由选择协议,P多播,虚拟专用网络VPN,MPLS多协议标签

文章目录 5 IPv65.1 组成5.2 IPv6地址5.3 从IPv4向IPv6过渡5.3.1 双协议栈5.3.2 隧道技术 6 因特网的路由选择协议6.1 内部网关协议RIP6.2 内部网关协议 OSPF基本特点 6.3 外部网关协议 BGP6.3.1 路由选择 6.4 路由器组成6.4.1 基本了解6.4.2 结构 7 IP多播7.1 硬件多播7.2 IP多…

Inscribe:应用非定向资产交易协议 布局巨大铭文赛道

随着比特币出现了一定的回调&#xff0c;铭文市场也出现了50%以上的跌幅&#xff0c;但是从市场的长期发展来看&#xff0c;铭文市场空间巨大&#xff0c;仍然是未来千亿级的蓝海市场&#xff0c;那么这样的回调阶段正式各类优质项目深度BUILD 扩展自己产品生态提升竞争力的关键…

还在用QQ拼音输入法吗?赶快卸载吧~!

最近总觉得我的C盘在莫名其妙的减少。之前的电脑C盘只有240G&#xff0c;所以我很在意C盘空间。但是&#xff0c;我发现买了新电脑&#xff0c;C盘空间也在莫名其妙减少。 随挨个文件夹检查。最后发现&#xff0c;QQ拼音的 dict 文件夹很大&#xff0c;居然有 30G多G。 30多~…

minio 整合springboot

pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

如何快速优化大数据量订单表

场景 本篇分享以前在广州一家互联网公司工作时遇到的状况及解决方案,这家公司有一个项目是SOA的架构,这个架构那几年是很流行的,哪怕是现在依然认为这个理念在当时比较先进。 当时的项目背景大概是这样,这家公司用的是某软提供的方案,项目已经运行3年多,整体稳定。 数据…

IPSec的起源-基础知识都需要掌握

IPSec的起源 目的 出于安全考虑。 最开始的互联网是明文通信&#xff0c;很容易被监听、篡改。添加了如crc一类的校验也不能完全保证数据的安全。 在IP层专门做的安全防护。 为什么是IP层&#xff1f;在当时IP层可通信的范围最广、应用最多。 开始也是从MAC层开始&#xff0c;后…

var let const的区别和使用场景?

var、let 和 const 是 JavaScript 中用于声明变量的关键字&#xff0c;它们之间有着一些区别和各自的使用场景。 var 作用域&#xff1a;var是在函数作用域&#xff08;function scope&#xff09;内声明的变量&#xff0c;如果在函数内部声明则只在函数内部有效&#xff0c;在…

中金汇融配资分享在线杠杆炒股的安全知识

随着股市的火爆&#xff0c;越来越多的人选择加入杠杆炒股的行列。然而&#xff0c;对于许多新手来说&#xff0c;如何安全有效地使用杠杆炒股却是一个难题。今天&#xff0c;我们就来为大家分享一家专业、安全、靠谱的在线杠杆炒股平台——中金汇融&#xff0c;让你轻松掌握在…

mysql mha高可用

一、前言 在原本的一主两从数据库架构中&#xff0c;是没有高可用功能的&#xff0c;当主库挂了时不会自动将剩下的从从升级为主库&#xff0c;只能等待主库恢复才能使用&#xff0c;或者手动切换&#xff0c;但是手动切换后需要更改后端服务中的数据库地址信息&#xff0c;在此…

架构设计到底是什么?

文章目录 架构设计有哪些内容&#xff1f;架构原理与技术认知分布式技术原理与设计中间件常用组件的原理和设计问题数据库原理与设计问题分布式缓存原理与设计问题互联网高性能高可用设计问题 技术认知架构分析问题分析能力边界 架构设计&#xff0c;是中高级研发工程师逃不开的…

C# 获取Excel里引用的外部其他excel文件清单

关键方法:mySheet.Application.ActiveWorkbook.LinkSources(XlLink.xlExcelLinks); 主要代碼如下 Application myExcel null;//引用Excel Application类別 Workbook myBook null;//引用活页簿类別 Worksheet mySheet null;//引用工作表类別 …

软件设计模式:单例模式

文章目录 前言一、单例模式实现1.饿汉式静态变量方式静态代码块方式 2.懒汉式线程不安全线程安全双重检查锁静态内部类方式枚举方式 二、存在问题1.序列化反序列化2.反射破坏3.解决序列化破坏解决反射破坏解决 三、JDK源码解析总结 前言 单例模式&#xff08;Singleton Patter…

windows远程桌面怎么开启?

文章目录 如下三种开启方式&#xff0c;任选一即可方式1.在系统属性中开启远程桌面方式2.通过系统设置开启远程桌面方式3.注册表编辑器开启远程桌面使用远程桌面 如下三种开启方式&#xff0c;任选一即可 配合 组网工具或者内网穿透 超级爽 局域网其他pc如何访问宿主机虚拟机IP…

@RequestParam、@PathVariable、@RequestBody、@RequestAttribute详解

一、RequestParam注解 作用&#xff1a;用于将指定的请求参数赋值给方法中的形参。 属性&#xff1a; 1&#xff09;value&#xff1a;请求参数名&#xff08;必须配置&#xff09; 2&#xff09;required&#xff1a;是否必需&#xff0c;默认为 true&#xff0c;即请求中必须…

Elasticsearch:什么是文本分类?

文本分类定义 - text classification 文本分类是一种机器学习&#xff0c;它将文本文档或句子分类为预定义的类或类别。 它分析文本的内容和含义&#xff0c;然后使用文本标签为其分配最合适的标签。 文本分类的实际应用包括情绪分析&#xff08;确定评论中的正面或负面情绪&…

GLTF/GLB模型在线预览、编辑、动画查看以及材质修改

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预…