C++零碎记录(十三)

23. 多态

23.1 多态简介

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

② 多态分为两类:

1. 静态多态:函数重载和运算符重载属于静态多态,复用函数名。
2. 动态多态:派生类和 虚函数实现运行时多态。

③ 静态多态和动态多态区别:

1. 静态多态的函数地址早绑定,编译阶段确定函数地址。
2. 动态多态的函数地址晚绑定,运行阶段确定函数地址。

④ 多态满足条件:

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

④ 多态使用条件:

1. 父类指针或引用指向子类对象

⑤ 重写:函数返回值类型、函数名、参数列表都完全一致称为重写。

23.2 多态地址绑定

23.2.1 地址早绑定

#include <iostream>
using namespace std;//多态//动物类
class Animal
{
public:void speak(){cout << "动物在说话" << endl;}
};//猫类
class Cat:public Animal
{
public:void speak(){cout << "小猫在说话" << endl;}
};//执行说话的函数
//地址早绑定 在编译阶段确定函数地址
//如果想执行让猫说话,那么这个函数就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定
void doSpeak(Animal &animal)  // Animal & animal = cat
{animal.speak();
}void test01()
{Cat cat;doSpeak(cat);
}int main()
{test01();system("pause");return 0;}

运行结果:

  • 动物在说话
  • 请按任意键继续. . .

23.2.2 地址晚绑定虚函数

#include <iostream>
using namespace std;//多态//动物类
class Animal
{
public:virtual void speak(){cout << "动物在说话" << endl;}
};//猫类
class Cat:public Animal
{
public://重写 函数返回值类型、函数名、参数列表都完全相同才叫重写void speak()   //子类virtual可写可不写,也可以写 virtual void speak(){cout << "小猫在说话" << endl;}
};//狗类
class Dog:public Animal
{
public:virtual void speak(){cout << "小狗在说话" << endl;}
};//执行说话的函数
//地址早绑定 在编译阶段确定函数地址
//如果想执行让猫说话,那么这个函数就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定//动态多态满足条件
//1、有继承关系
//2、子类重写父类的虚函数//动态多态使用
//父类的引用或指针指向子类对象void doSpeak(Animal &animal)  // Animal & animal = cat
{animal.speak();
}void test01()
{Cat cat;doSpeak(cat);Dog dog;doSpeak(dog);
}int main()
{test01();system("pause");return 0;}

运行结果:

  • 小猫在说话
  • 小狗在说话
  • 请按任意键继续. . .

23.3 多态的原理剖析

① 当没有发生重写时,子类中的虚函数表内部为父类的虚函数地址。

② 当子类重写父类的虚函数,子类中的虚函数表内部会替换成子类的虚函数地址。

#include <iostream>
using namespace std;//多态//动物类
class Animal
{
public:                   //如果是虚函数,那么类里面存了一个指针,类占4个字节virtual void speak()  //如果是非静态成员函数void speak(),那么函数不在类上,空类占1个字节空间                     {cout << "动物在说话" << endl;}
};//猫类
class Cat:public Animal
{
public:void speak()   {cout << "小猫在说话" << endl;}
};//狗类
class Dog:public Animal
{
public:virtual void speak(){cout << "小狗在说话" << endl;}
};//执行说话的函数
//地址早绑定 在编译阶段确定函数地址
//如果想执行让猫说话,那么这个函数就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定//动态多态满足条件
//1、有继承关系
//2、子类重写父类的虚函数//动态多态使用
//父类的引用或指针指向子类对象void doSpeak(Animal &animal)  // Animal & animal = cat
{animal.speak();
}void test01()
{Cat cat;doSpeak(cat);Dog dog;doSpeak(dog);
}void test02()
{cout << "sizeof Animal = " << sizeof(Animal) << endl;
}int main()
{//test01();test02();system("pause");return 0;}

运行结果:

  • sizeof Animal = 4
  • 请按任意键继续. . .

链接:https://www.zhihu.com/question/437657370/answer/1692846096
 

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

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

相关文章

通过 chatgpt 协助完成网站数据破解

Chatgpt 的出现极大地提升了程序员的工作效率&#xff0c;常见的使用场景包括代码自动生成、代码静态检查等&#xff0c;那么 chatgpt 能否用于某些网站的数据破解工作呢&#xff1f; 问题 某天线上服务开始报警&#xff0c;原来是某个视频网站无法获取到其 cdn 地址导致的下…

K8s上安装gitlab-ce

文章目录 K8s上安装gitlab-ce操作如下gitlab-deployment.yml K8s上安装gitlab-ce 前言   使用pv-pvc来持久化gitlab的数据&#xff0c;配置&#xff0c;日志文件。   pod启动后需要需要修改external_url然后重启pod。 操作如下 mkdir -p /mnt/data01/gitlab ctr -n k8s.…

内外统一的边缘原生云基础设施架构——火山引擎边缘云

近日&#xff0c;火山引擎边缘云边缘计算架构师郭少巍在LiveVideoStack Con 2023上海站围绕火山引擎边缘云海量分布式节点和上百T带宽&#xff0c;结合边缘计算在云基础设施架构方面带来的挑战&#xff0c;分享了面对海量数据新的应用形态对低时延和分布式架构的需求&#xff0…

数据通信网络之IPv6以太网二层交换

文章及资源归档至【AIShareLab】&#xff0c;回复 通信系统与网络 可获取。 文章目录 一、目的二、环境及网络拓扑三、需求四、步骤 一、目的 掌握 VLAN、Trunk 的基础配置。掌握以太网链路聚合的基础配置。掌握路由器子接口的配置&#xff0c;以及通过子接口实现 VLAN 之间互…

4.1.8- Web 应用程序使用的组件进行指纹识别

Web 应用程序使用的组件进行指纹识别 IDWSTG-INFO-08 总结 毫不夸张地说&#xff0c;几乎所有可以想象的Web应用程序的想法都已经投入开发。随着全球大量自由和开源软件项目的积极开发和部署&#xff0c;应用程序安全测试很可能会遇到完全或部分依赖于这些知名应用程序或框架…

[uniapp]踩坑日记 unexpected character > 1或‘=’>1 报错

在红色报错文档里下滑&#xff0c;找到Show more 根据提示看是缺少标签&#xff0c;如果不是缺少标签&#xff0c;看看view标签内容是否含有<、>、>、<号,把以上符合都进行以<号为例做{{“<”}}处理

Java多线程并发面试题

文章目录 Java并发基础并行和并发有什么区别&#xff1f;说说什么是进程和线程&#xff1f;Java线程创建方式&#xff1f;Runnable和Callable接口的区别&#xff1f;为什么调用start()方法时会执行run()方法&#xff0c;不直接调用run()方法&#xff1f;sleep()和wait()的区别&…

5.11.Webrtc接口的设计原理

在上节课中呢&#xff0c;我向你介绍了web rtc的接口宏&#xff0c;那有很多同学会产生疑问啊&#xff0c;那觉得web rtc为什么要把接口设计的这么复杂&#xff1f;还非要通过宏来实现一个代理类&#xff0c;再通过代理类来调用到web rtc内部。 那为什么要这么设计呢&#xf…

【计算机视觉 | 目标检测】干货:目标检测常见算法介绍合集(四)

文章目录 四十六、Parallel Feature Pyramid Network四十七、ScanSSD四十七、RetinaMask四十八、CornerNet-Saccade四十九、CentripetalNet五十、Fast Focal Detection Network五十一、CornerNet-Squeeze五十二、Paddle Anchor Free Network五十三、Human Robot Interaction Pi…

王道数据结构C语言顺序表基本操作实现

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #define MaxSize 50 typedef struct {//顺序表(静态实现)int data[MaxSize];//顺序表元素int length;//顺序表当前长度 }SqList;//类型定义#define InitSize 100; typedef struct {//动态实…

Python爬虫有哪些库,分别怎么用

目录 Python常用爬虫库 代码示例 requests BeautifulSoup Scrapy Selenium PyQuery Axios requests-html pyppeteer 总结 Python是一种非常流行的编程语言&#xff0c;因其易学易用和广泛的应用而受到开发者的喜爱。在Python中&#xff0c;有许多库可以用于爬虫程序…

langchain主要模块(四):Memory

langchain2之Memory langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.MemoryConversationBufferMemoryConversationBufferWindowMemoryConversationTokenBufferMemoryConversati…