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方法时,会根据实际指向的对象来调用相应的函数版本。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter接口自动化02--JMeter的安装和使用

p02 高清B站视频链接 2.1 Windows环境 首先需要安装JDK&#xff0c;然后再部署JMeter。注意&#xff0c;JMeter对JDK的版本是有要求的&#xff0c;一般至少要JDK8&#xff0c;这也是目前开发过程中使用频繁的版本。 1. 安装JDK 从官网下载JDK&#xff1a;https://www.oracl…

Abaqus2023安装下载教程

用钢铁意志&#xff0c;成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程&#xff0c;希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙&#xff0c;并保证计算机名不是中文&#xff01;&#xff01;&#xff01;&#xff01; 1.首先创建一个用于Abaqus…

从vue小白到高手,从一个内容管理网站开始实战开发第七天,登录功能后台功能设计--通用分页、枚举以及相关工具类

上一篇实现了数据库访问层的相关功能,还没有了解的小伙伴可以去看前面文章实现的内容,因为每一篇内容都是连贯的,不学习的话可能下面的内容学习起来会有点摸不着头脑 从vue小白到高手,从一个内容管理网站开始实战开发第六天,登录功能后台功能设计--API项目中的登录实现(二…

先锋WEB燃气收费系统 Upload.aspx 文件上传漏洞复现

0x01 产品简介 先锋WEB燃气收费系统是一种先进的在线燃气收费解决方案,旨在简化和优化燃气收费的流程和管理。该系统基于Web平台,提供了一系列功能和工具,使燃气公司能够高效地进行收费、账单管理和客户服务。 0x02 漏洞概述 先锋WEB燃气收费系统/AjaxService/Upload.asp…

PHP版学校教务管理系统源码带文字安装教程

PHP版学校教务管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 系统介绍&#xff1a; 后台权限控制&#xff1a;支持多个管理员&#xff0c;学生管理&#xff0c;学生成绩&#xff0c;教师管理&#xff0c;文章管理&#x…

vscode+opencv基础用法学习1

案例1&#xff1a;读取图片信息 如果是使用云服务器的话&#xff0c;由于图形界面的问题&#xff0c;使用cv::show来显示图片会报错 // 图片的读取和显示 // 导入opencv头文件 #include "opencv2/opencv.hpp" #include <iostream>int main(int argc, char** …

代码结构:为何重要算法不和接口编译到一个dll里面

这里是vision master的例子。 有两点需要向他学习的。 1 需要每个算子是一个dll。优点是方便业务上&#xff0c;针对不同的算子精细化的更新&#xff0c;或者售卖。 2 每个算子的dll我们理解&#xff0c;内容主要是其接口的实现。而真正的算法内容是在上面的algorithm.dll中…

边缘计算AI智能分析网关V4算力分析及应用场景

一、硬件介绍 智能分析网关V4是TSINGSEE青犀视频推出的一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz。硬件内置近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、…

从零到一的方法:学习视频剪辑与嵌套合并技巧

随着社交媒体和数字技术的快速发展&#xff0c;视频制作已是常见的工作。那么如何批量嵌套合并视频呢&#xff1f;下面一起来看云炫AI智剪如何批量合并的方法。 嵌套合并后的视频截图查看。 批量嵌套合并的操作&#xff1a; 操作1、在云炫AI智剪上选择“嵌套合并”功能&#…

SpringMVC ResponseEntity常见使用场景

ResponseEntity 作为 Spring MVC controller层 的 HTTP response&#xff0c;包含 status code, headers, body 这三部分。 正常场景 RestController Slf4j public class SearchController {AutowiredUserService userService;RequestMapping(value "/getAllStudents4&…

团结引擎的安装

团结引擎有多种方式可以安装&#xff0c;具体可以参考团结引擎官方文档&#xff0c;这里我们使用最简单的安装方式&#xff0c;通过团结Hub来安装。 1. 安装 Tuanjie Hub 进入团结引擎官网&#xff0c;点击右上角的【下载Unity】&#xff0c;进入下载界面&#xff0c;选择“下载…

Ubuntu 22.04 基础环境搭建

这是Ubuntu软件安装系列的第一篇&#xff0c;我们来聊聊基础环境搭建。 这个专栏主要讲一些常见服务端软件的安装和配置&#xff0c;当然也包括对软件架构和作用的分析&#xff0c;以及使用的场景的介绍。 注意我们这里使用的Ubuntu的版本是22.04&#xff0c;基本上大厂的云服…

hcip实验2

根据地址分配完成基础配置 先配置r1,r2,r3的ospf以及与isp通讯&#xff1a; 配置缺省路由&#xff1a; 完成nat配置&#xff1a; 完成r5,r6,r7,r8,r15的mgre以及整个网络的ospf配置 mgre&#xff1a; area 2 和3之间用多进程双向重发布技术完成&#xff1a; area4和5之间用虚…

基于elementUI封装的带复选框el-checkbox的下拉多选el-select组件

效果图&#xff1a; 组件&#xff1a;MultipleSelect.vue <template><el-select v-model"selectValues" v-bind"$attrs" v-on"listeners" multiple placeholder"请选择" style"width: 50%" change"changeSel…

什么是金融RPA?金融RPA解决什么问题?金融RPA实施难点在哪里?

什么是金融RPA&#xff1f;金融RPA&#xff0c;即金融领域的机器人流程自动化&#xff0c;是一种利用软件机器人来代替人工完成重复性劳动任务的技术。它能够通过模仿最终用户在电脑上的手动操作方式&#xff0c;实现自动化处理大量重复、规则明确的业务流程&#xff0c;如账务…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷④

任务二 单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码…

人工智能:未来智慧城市建设的“智慧大脑”与核心价值

目录 一、引言 二、人工智能在智慧城市中的应用实例 三、人工智能对智慧城市建设的核心价值 四、面临的挑战与未来展望 五、结语 六、附&#xff1a;智慧城市全套解决方案大合集 - 下载 一、引言 随着科技的飞速发展&#xff0c;智慧城市的概念逐渐深入人心。智慧城市利…

怎么一边讲PPT一边录视频 如何一边录制PPT一边录制人像 录屏软件免费录屏 PPT录制怎么录制

随着新媒体技术的发展&#xff0c;短视频和直播越来越火。越来越多的小伙伴加入了视频制作的大军&#xff0c;那么你想知道怎么一边讲PPT一边录视频&#xff0c;如何一边录制PPT一边录制人像吗&#xff1f; 一、怎么一边讲PPT一边录视频 我们可以借助PPT本身自带的屏幕录制功能…

使用Java连接MongoDB (6.0.12) 报错

报错&#xff1a; Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error 352: Unsupported OP_QUERY command: create. 上图中“The client driver may require an upgrade”说明了“客户端驱动需要进行升级”&#xff0c;解…

乔拓云智能建站:让你的官网与众不同

在这个数字化的时代&#xff0c;拥有一个专业、具有吸引力的官方网站已成为企业必不可少的部分。乔拓云智能建站以其独特的功能和高效的服务&#xff0c;成为企业快速构建专业官网的首选。 一、丰富的模板&#xff0c;独特设计 乔拓云智能建站提供了众多专业的模板&#xff0c…