C++学习笔记——多态与静态联编和动态联编

目录

一、多态

二、静态联编(Static Binding)和动态联编(Dynamic Binding)

2.1静态联编

2.2动态联编


一、多态

是C++中面向对象编程的一个核心概念,它允许派生类对象替代其基类对象,从而实现代码重用和扩展。公有继承是一种实现多态性的方式。

公有继承是指在派生类中定义了与基类中同名的成员函数,当使用基类指针或引用调用该函数时,实际调用的是派生类中的版本。这种行为被称为函数重写(Function Overriding)或运行时多态性(Run-time Polymorphism)。

以下是一个简单的示例,演示了公有继承的多态特性:

#include <iostream>class Animal {
public:virtual void makeSound() {std::cout << "Animal makes a sound." << std::endl;}
};class Dog : public Animal {
public:void makeSound() override {std::cout << "Dog barks." << std::endl;}
};int main() {Animal* animal = new Animal();Dog* dog = new Dog();animal->makeSound();  // 输出 "Animal makes a sound."dog->makeSound();     // 输出 "Dog barks."Animal* animal2 = dog;animal2->makeSound(); // 输出 "Dog barks."delete animal;delete dog;return 0;
}

在这个示例中,我们定义了一个基类Animal和一个派生类Dog。基类中有一个虚函数makeSound,它被派生类重写。在main函数中,我们创建了一个基类对象和一个派生类对象,并通过它们分别调用makeSound方法。此时,基类对象调用的是基类中的版本,而派生类对象调用的是派生类中的版本。

接着,我们将派生类对象的地址赋给了一个基类指针,然后通过该指针调用makeSound方法。由于makeSound方法是虚函数,因此编译器会在运行时根据实际对象类型来确定要调用哪个版本的函数,这种行为被称为多态性。

二、静态联编(Static Binding)和动态联编(Dynamic Binding)

是C++中用于确定函数调用的两种不同的机制。

2.1静态联编

是在编译时确定函数调用的机制。它根据函数调用的静态类型来确定要调用的函数版本。静态类型是指在编译时已知的变量或表达式的类型。静态联编是默认的绑定机制,适用于非虚函数和全局函数。

以下是一个示例,演示了静态联编的行为:

#include <iostream>class Animal {
public:void makeSound() {std::cout << "Animal makes a sound." << std::endl;}
};class Dog : public Animal {
public:void makeSound() {std::cout << "Dog barks." << std::endl;}
};int main() {Animal animal;Dog dog;Animal* animalPtr = &animal;Animal* dogPtr = &dog;animalPtr->makeSound(); // 输出 "Animal makes a sound."dogPtr->makeSound();    // 输出 "Animal makes a sound."return 0;
}

在这个示例中,我们定义了一个基类Animal和一个派生类Dog,它们都有一个名为makeSound的函数。在main函数中,我们创建了一个基类对象和一个派生类对象,并将它们分别赋值给基类指针animalPtrdogPtr。然后,我们通过这两个指针调用makeSound方法。

由于静态联编是根据指针的静态类型来确定函数版本,因此无论使用哪个指针调用makeSound方法,都会调用基类中的版本,而不会调用派生类中的版本。

相比之下

2.2动态联编

是在运行时确定函数调用的机制。它根据函数调用的实际对象类型来确定要调用的函数版本。动态联编适用于虚函数和通过基类指针或引用调用的成员函数。

以下是一个示例,演示了动态联编的行为:

#include <iostream>class Animal {
public:virtual void makeSound() {std::cout << "Animal makes a sound." << std::endl;}
};class Dog : public Animal {
public:void makeSound() override {std::cout << "Dog barks." << std::endl;}
};int main() {Animal animal;Dog dog;Animal* animalPtr = &animal;Animal* dogPtr = &dog;animalPtr->makeSound(); // 输出 "Animal makes a sound."dogPtr->makeSound();    // 输出 "Dog barks."return 0;
}

在这个示例中,我们将makeSound函数声明为虚函数,并使用override关键字在派生类中重写该函数。在main函数中,我们创建了一个基类对象和一个派生类对象,并将它们分别赋值给基类指针animalPtrdogPtr。然后,我们通过这两个指针调用makeSound方法。

由于动态联编是根据指针所指向的实际对象类型来确定函数版本,因此使用基类指针调用makeSound方法时,会根据实际对象类型来决定是调用基类中的版本还是派生类中的版本。在这个示例中,基类指针调用makeSound方法时,会根据实际指向的对象来调用相应的函数版本。

总结起来,静态联编是在编译时确定函数调用的机制,根据静态类型来决定调用哪个函数版本;而动态联编是在运行时确定函数调用的机制,根据实际对象类型来决定调用哪个函数版本。虚函数和通过基类指针或引用调用的成员函数使用动态联编。

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

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

相关文章

代码随想录算法训练营第17天 | 110.平衡二叉树 + 257. 二叉树的所有路径 + 404.左叶子之和

今日内容 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 110.平衡二叉树 - Easy 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1…

springboot注解@PropertySource作用

简介 PropertySource 是 Spring 框架中的一个注解&#xff0c;用于指定一个或多个属性文件&#xff08;通常是.properties文件&#xff09;这些文件包含了应用程序需要的配置信息。当你在 Spring 的配置类中使用此注解时&#xff0c;Spring 容器会加载这些属性文件&#xff0c…

01.坦克大战项目-Java绘图坐标体系

01.坦克大战项目- Java绘图 01. Java绘图坐标体系 1. 坐标体系介绍 ​ 下图说明了java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标系&#xff0c;表示当前位置为水平方向&#xff0c;距离坐标原点x个像素&#xff1b;第二…

揭露欧拉骗局4.“Σ1/n²=π²/6”里的猫腻

自然数平方倒数求和Σ1/n是一个并不复杂的问题&#xff0c;但它困扰了欧洲大陆整整90年&#xff0c;在欧系数学里它被称为“巴塞尔级数”。 解决巴塞尔级数让欧拉一战成名&#xff0c;然而欧拉采用的方法对数学这门学问是严重的侮辱。数学是工具学科&#xff0c;数学的宗旨是化…

Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查

文章目录 什么是 Consul?安装和运行 ConsulAsp .Net Core 如何集成 Consul 实现服务注册和健康检查Consul.AspNetCore 中的 AddConsul 和 AddConsulServiceRegistration 方法 究竟做了什么&#xff1f;AddConsul 方法AddConsulServiceRegistration 方法 配置 Consul 检查服务封…

【椒盐玉兔】GPTs Store 商店的TOP100 自定义GPT使用报告

详细的图文报告有100张图&#xff0c;因为太长就放网盘链接 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;ub2n 解压密码&#xff1a;heehel 更多作品&#xff1a;长期更新国内外&#xff0c;中英文AI人工智能作品 整理获取 通过算法&#xff0c;筛选出了目前访…

每天刷两道题——第十四天

1.1矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出&#xff1a;[[0,0,0,0],[0,4,5,0],[0,3,1,0]] 原地算法&#xff08;…

Java面试题(java高级面试题)

线程池的核心线程数设置为多大比较合理&#xff1f; Worker线程在执行的过程中&#xff0c;有一部计算时间需要占用CPU&#xff0c;另一部分等待时间不需要占用CPU&#xff0c;通过量化分析&#xff0c;例如打日志进行统计&#xff0c;可以统计出整个Worker线程执行过程中这两…

书生·浦语大模型--第二节课笔记

书生浦语大模型--第二节课 大模型及InternLM基本介绍实战部分demo部署准备工作模型下载代码准备终端运行web demo 运行 Lagent 智能体工具调用 Demo准备工作Demo 运行 浦语灵笔图文理解创作 Demo环境准备下载模型下载代码运行 大模型及InternLM基本介绍 大模型 定义&#xff…

一阶低通滤波器

一阶低通滤波器 X为输入&#xff0c;Y为滤波后得到的输出值&#xff1b;本次的输出结果主要取决于上次的滤波输出值&#xff0c;其中a是和滤波效果有关的一个参数&#xff0c;称为滤波系数&#xff1b;它决定新采样值在本次滤波结果中所占的权重&#xff1b; 滤波系数a越小&a…

500mA High Voltage Linear Charger with OVP/OCP

一、General Description YHM2810 is a highly integrated, single-cell Li-ion battery charger with system power path management for space-limited portable applications. The full charger function features Trickle-charge, constant current fast charge and const…

Java中的栈和队列操作,相互实现(力扣 232, 225)

栈和队列&#xff08;Java&#xff09; Java中的 栈 & 队列 操作栈的使用队列的使用 LeetCode 232. 用栈实现队列我的代码 LeetCode 225. 用队列实现栈我的代码 Java中的 栈 & 队列 操作 栈的使用 栈的方法功能Stack()构造一个空的栈E push(E e)将e入栈&#xff0c;并…

【开源】基于JAVA语言的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

Vulnhub-GoldenEye

一、信息收集 nmap探测&#xff1a;nmap -p 1-65535 -T4 -A -v 192.168.1.9 PORT STATE SERVICE VERSION 25/tcp open smtp Postfix smtpd |_smtp-commands: ubuntu, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN |_…

Python基础知识:整理12 JSON数据格式的转换

首先导入python中的内置包json import json 1 准备一个列表&#xff0c;列表内每个元素都是字典&#xff0c;将其转换为JSON 使用json.dumps()方法 data [{"name": "John", "age": 30}, {"name": "Jane", "age":…

HarmonyOS Stage模型 UIAbility生命周期状态

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态 Create状态&#xff0c;在UIAbility实例创建时触发&#xff0c;对应onCreate回调。可以在onCreate回调中进行相关初始化操作 import UIAbility from ohos.app.ability.UIAbility; import window from…

NAND SCA接口对性能影响有多大?

在多LUN场景下&#xff0c;SCA接口尤其有助于提高随机读取性能。通过合理安排读取命令和等待时间&#xff08;如tR&#xff09;&#xff0c;SCA接口可以在一个LUN完成读取后立即开始另一个LUN的读取操作&#xff0c;而无需等待整个DQ总线空闲&#xff0c;从而减少了延迟和提高了…

基于SpringBoot的洗衣店管理系统

基于SpringBoot的洗衣店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 可视化展示 用户界面 管理员界面 摘要 洗衣店管理系统基于Spring Boot框…

IBM X3750 M4服务器主板故障全国协助处理

2023年12月31这天中午看到有位网络朋友加我&#xff0c;通过后该用户反馈说是有一台IBM System x3750 M4服务器有故障&#xff0c;现在无法开机。希望我们工程师协助他检测 分析 定位该故障问题原因和处理方案。 如上图所示&#xff1a;经过工程师与用户排查&#xff0c;发现该…

pytorch学习笔记(七 )

池化类似压缩 最大池化-上采样 例如给一个3的话就会生成一个33的窗口&#xff08;生成相同的高和宽&#xff09;&#xff0c;给一个tuple就会给出一个相同的池化核。stride默认值就是核的大小 dilation 在卷积dialation设置之后每一个会和另外的差一个&#xff0c;空洞卷积 …