C++核心编程——4.7 多态

4.7.1 多态的基本概念

多态是C++面向对象三大特性之一

多态表示提供一个公共的函数接口,当传入不同参数对象时,执行不同的函数实现。

语法

virtual 返回值类型 函数名()  {}

分类

静态多态

动态多态(加“virtual“)

函数重载 和 运算符重载

(复用函数名,函数/运算符用多种方式表示 )

派生类和虚函数实现

(父类必须写“virtual“,子类可写可不写)

地址早绑定(编译阶段确定)地址晚绑定(运行阶段确定)
满足条件

1、有继承关系
2、子类重写父类中的虚函数

(函数返回值类型、函数名、参数列表完全相同,与重载不同)

使用方法

父类的指针/引用 指向 子类对象

语法

(引用)

父类类名 & 父类对象 = 子类类名

(指针)

父类类名 * 父类对象 = new 子类类名

例子Animal & animal  = CatAbstractCalculator *abc = new AddCalculator
//动物类
class Animal
{
public://Speak函数就是虚函数//函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。virtual void speak(){cout << "动物在说话" << endl;}
};
//派生类
class Cat :public Animal
{
public:void speak(){cout << "小猫在说话" << endl;}
};class Dog :public Animal
{
public:void speak(){cout << "小狗在说话" << endl;}};//如果函数地址在编译阶段就能确定,那么静态联编
//如果函数地址在运行阶段才能确定,就是动态联编void DoSpeak(Animal & animal) //用引用的方式传递
{animal.speak();//定义里面是Animal后无论后面再传入什么对象(cat/dog)都会执行Animal里面的,此时地址早绑定//如果要传入特定对象(cat/dog)后执行特点对象里面的内容,就需要地址晚绑定 加“virtual“(父类必须写,子类可写可不写
}
void test01()
{Cat cat;DoSpeak(cat);Dog dog;DoSpeak(dog);
}
int main() {test01();system("pause");return 0;
}

4.7.2 纯虚函数和抽象类

问题: 在多态中父类的虚函数实现基本不会调用,主要都是调用子类重写的内容

方案:将虚函数改为纯虚函数(就是为了让子类重写虚函数(多态),否则没有任何意义)

语法(必须在虚函数的基础上):virtual 返回值类型 函数名 (参数列表)= 0 ;

特点:

当类中只要有了纯虚函数,这个类也称为 “抽象类”

堆/栈上都无法无法实例化对象(对象没有意义)

子类必须重写抽象类中的纯虚函数,否则也属于抽象类(也无法实例化函数)

class Base
{
public:virtual void func() = 0;
};class Son :public Base
{
public:virtual void func() {cout << "func调用" << endl;};
};void test01()
{Base * base = NULL;//base = new Base; // 错误,抽象类无法实例化对象base = new Son;base->func();delete base;//记得销毁
}int main() {test01();system("pause");return 0;
}

4.7.3 虚析构和纯虚析构

问题:子类中有堆区开放数据时,父类指针在释放时无法调用到子类的析构代码,会造成数据泄露

方案:将父类中的析构函数改为虚析构或者纯虚析构

虚析构纯虚析构
语法virtual ~类名(){}

virtual ~类名() = 0;

类名::~类名(){}

有具体的函数实现类内没有具体的函数,但类外必须加上,否则连接时报错
有纯虚析构,该类属于抽象类,无法实例化对象
特点两者只能保留其一(子类中没有堆区数据,可以不写为虚析构或纯虚析构)
class Animal {
public:Animal(){cout << "Animal 构造函数调用!" << endl;}virtual void Speak() = 0;//析构函数加上virtual关键字,变成虚析构函数//virtual ~Animal()//{//	cout << "Animal虚析构函数调用!" << endl;//}//纯虚析构和虚析构只能有一个,不能同时存在virtual ~Animal() = 0;  //只有声明没有实现会在链接的时候报错,必须有具体的实现
};Animal::~Animal()
{cout << "Animal 纯虚析构函数调用!" << endl;
}//和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能够被实例化。class Cat : public Animal {
public:Cat(string name){cout << "Cat构造函数调用!" << endl;m_Name = new string(name);//new的是string,返回的就是string的指针}virtual void Speak(){cout << *m_Name <<  "小猫在说话!" << endl;}~Cat(){cout << "Cat析构函数调用!" << endl;if (this->m_Name != NULL) {delete m_Name;m_Name = NULL;}}public:string *m_Name;      //让小猫的名字创建在堆区,用该指针进行维护
};void test01()
{Animal *animal = new Cat("Tom");animal->Speak();//虚析构函数就是用来解决通过父类指针释放子类对象delete animal;
}int main() {test01();system("pause");return 0;
}

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

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

相关文章

基于Pytorch框架的深度学习RegNet神经网络二十五种宝石识别分类系统源码

第一步&#xff1a;准备数据 25种宝石数据&#xff0c;总共800张&#xff1a; { "0": "Alexandrite","1": "Almandine","2": "Benitoite","3": "Beryl Golden","4": "Carne…

数字化农业新时代:图扑农林牧综合监控平台

利用图扑自研 HT for Web GIS 产品&#xff0c;结合遥感技术&#xff0c;构建可交互式的农林牧数据分析平台。该平台围绕地块总览、播种分析、牛只管理、设备查询四个维度&#xff0c;对地区的全貌、农场、村集体分布以及相应的环境进行多样化的可视化展示和进行数据支持&#…

爱岗敬业短视频:成都科成博通文化传媒公司

爱岗敬业短视频&#xff1a;传递正能量&#xff0c;塑造职场新风尚 在当今社会&#xff0c;短视频以其独特的传播方式和广泛的受众群体&#xff0c;成为了信息传播的重要渠道。在众多短视频内容中&#xff0c;以“爱岗敬业”为主题的短视频尤为引人注目&#xff0c;成都科成博…

js Ajax函数封装及使用

直接上代码 一、ajax函数封装 /*** ajax函数* param {Object} options 请求传入的对象参数*/ function ajax(options {}) {// 1. 参数校验// 校验请求地址必传,而只能是字符串类型if (!options.url || typeof (options.url) ! string) throw Error(url必传,只能是字符串);//…

每天发布1000个视频SOP之账号管理:抖音可用的上传管理账号的浏览器安装包23个

企业抖音运营&#xff1a; 全流程整套操作SOP&#xff0c; 每天发布1000个视频工作管理体系&#xff1a; &#xff08;因为上传限制&#xff0c;分成3个压缩包资源上传&#xff09; 这是其中的&#xff1a;SOP矩阵划管理登录抖音平台账号&#xff0c;上传管理运营账号&#…

FreeRtos进阶——队列的特殊用途

信号量与互斥量都一样&#xff0c;都是特殊的队列。但是只有互斥量实现了优先级继承机制。 信号量与互斥量与队列一样&#xff0c;在操作增加或者减少时&#xff0c;必须先关中断在进行操作&#xff01; 信号量创建揭秘 图中信号量的创建过程&#xff0c;在代码中的体现本质就是…

设计模式 16 解释器模式 Interpreter Design Pattern

设计模式 16 解释器模式 Interpreter Design Pattern 1.定义 解释器模式 (Interpreter Design Pattern) 是一种行为型设计模式&#xff0c;它定义了一种语法表示&#xff0c;并提供了一种解释器来解释该语法表示的句子。 核心概念&#xff1a; 语法表示 (Grammar): 定义了…

如何使用 jQuery 库来删除 HTML 页面中指定的元素下的所有子元素,但是保留其中一个特定的子元素

如何使用 jQuery 库来删除 HTML 页面中指定的元素下的所有子元素&#xff0c;但是保留其中一个特定的子元素 示例如下&#xff1a; 假设我们有以下的 HTML 代码&#xff1a; <div id"container"><div id"header">Header</div><div…

现在股票交易佣金标准最低是万0.854,低佣金炒股开户方式和流程!

股票交易佣金的最低标准是万分之0.854&#xff1b; 证券公司股票交易佣金默认是万分之3&#xff1b; 无门槛的股票交易佣金是万分之1&#xff1b; 万分之0.854的佣金要求投资者资产达到一定规模&#xff0c;不同的证券公司规定不一样。 如果没有经过证券公司客户经理协商开…

【SQL学习进阶】从入门到高级应用(一)

文章目录 MySQL命令行基本命令数据库表的概述初始化测试数据熟悉测试数据 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f49d;希望您在这里可以感受到一份轻松愉快的氛围&#x…

SolidityFoundry 安全审计测试 tx.origin 漏洞

名称&#xff1a;tx.origin 漏洞 solidityproject/vulnerable-defi at master XuHugo/solidityproject GitHub 说明&#xff1a; tx.origin是Solidity中的一个全局变量&#xff1b;智能合约中使用该变量进行身份验证&#xff0c;会使合约容易受到网络钓鱼攻击。 msg.sende…

C++牛客周赛43题目分享(3)小红平分糖果,小红的完全平方数,小苯的字符串变化,小红的子数组排列判断

目录 ​编辑 1.前言 2.四道题目 2.1小红平分糖果 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.2小红的完全平方数 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.3小苯的字符串变化 2.1.1题目描述 2.1.2输入描述 …

Java 原子变量 一次通关

前言 Java中的原子变量是用于实现无锁的线程安全编程的一种机制。它们是java.util.concurrent.atomic包中的一部分&#xff0c;这个包提供了一系列原子类&#xff0c;用于执行原子操作。 主要类型 Java的原子包提供了多种原子类&#xff0c;包括&#xff1a; 基本类型&…

想自学编程,看编程书有些看不懂,下一步应该怎么办?

不管你从事什么工作&#xff0c;编程都有助于你的职业发展。学习编程将给你自己赋能。我喜欢尝试新想法&#xff0c;时刻都有希望启动的新项目。学会编程后&#xff0c;我就可以坐下来自己实现&#xff0c;而不需要依赖他人。 编程也会提升你在其他方面的技能。因为你熟练掌握…

对SpringBoot配置文件配置项加密原理

参考认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor - 知乎 SpringBoot 之 Jasypt 实现yml配置文件加密_-djasypt.encryptor.password-CSDN博客 【springboot】jasypt加密_jasypt.encryptor.password-CSDN博客 实现&#xff1a; 导包&#xff1a; 使…

Gitlab不允许使用ssh拉取代码的解决方案

一、起因 之前一直是用ssh进行代码拉取&#xff0c;后来公司搞网安行动&#xff0c;不允许ssh进行连接拉取代码了 因为我是用shell写了个小型的CI/CD,部署前端项目用于后端联调的&#xff0c;因此在自动部署时&#xff0c;不方便人机交互&#xff0c;所以需要自动填充账密。 …

ZLMediaKit cmake 编译 要点

# 加载自定义模块 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(ZLMediaKit LANGUAGES C CXX) # 使能 C11 set(CMAKE_CXX_STANDARD 11) ############################### SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_SYSTEM_PROCESS…

护网2024-攻防对抗解决方案思路

一、护网行动简介 近年来&#xff0c;网络安全已被国家上升为国家安全的战略层面&#xff0c;网络安全同样也被视为维护企业业务持续性的关键。国家在网络安全治理方面不断出台法规与制度&#xff0c;并实施了一些大型项目和计划&#xff0c;如网络安全法、等级保护、网络安全…

【UE C++】 虚幻引擎C++开发需要掌握的C++和U++的基础知识有哪些?

目录 0 引言1 关键的 C 知识2 Unreal Engine 相关知识3 学习建议 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE C】 虚幻引擎C开发需要掌握的C和U的基础知识有哪些&#xff1f;❣️ 寄语&…

【MySQL精通之路】安全(1)-安全指南

任何在连接到Internet的计算机上使用MySQL的人都应该阅读本节&#xff0c;以避免最常见的安全错误。 在讨论安全性时&#xff0c;有必要考虑充分保护整个服务器主机&#xff08;而不仅仅是MySQL服务器&#xff09;免受所有类型的适用攻击&#xff1a;窃听、更改、播放和拒绝服…