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.hqwc.cn/news/343745.html

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

相关文章

[每周一更]-(第82期):认识自然处理语言(NLP)

GPT的大火&#xff0c;带起了行业内大模型的爆发&#xff1b;国内外都开始拥有或者研发自己的大模型&#xff0c;下边我们从NLP来进一步深入了解大模型、AI。 一、什么是NLP&#xff1f; 自然语言处理&#xff08;英语&#xff1a;Natural Language Processing&#xff0c;缩…

【动态规划】dp多状态问题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;按摩师&#x1f449;&…

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

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

MES系统如何进行产品的质量管理

质量管理重点是对产品的检验&#xff0c;这里面包括&#xff1a;采购来料检验、工序检验、入库前检验等几个检验环节&#xff0c;并根据系统设定的检验标准进行检验&#xff0c;检验不通过的不能留到下个环节。质量管理也是万界星空科技云MES中的一个重要组成部分&#xff0c;旨…

【深度学习】Anaconda3 + PyCharm 的环境配置 1:手把手带你安装 PyTorch 并创建 PyCharm 项目

前言 文章性质&#xff1a;实操记录 &#x1f4bb; 主要内容&#xff1a;这篇文章记录了 PyTorch 的安装过程&#xff0c;包括&#xff1a; 1. 创建并激活新的虚拟环境&#xff1b; 2. 查看电脑是否支持 CUDA 以及 CUDA 的版本&#xff1b; 3. 根据 CUDA 的版本安装 PyTorch&am…

NAND Separate Command Address (SCA) 接口命令解读

CA output packet和CA input packet是Separate Command Address (SCA) NAND接口协议中用于命令和地址传输的关键数据结构。 CA Input Packet: 在SCA接口中&#xff0c;输入到NAND器件的命令和地址信息被组织成并行至串行转换的CA&#xff08;Command and Address&#xff09;输…

主动学习基础-贝叶斯神经网络

引言 传统的深度神经网络一般都有过度自信的问题。 即使我给神经网络提供一个从来没有训练过的类别图像&#xff0c;神经网络也会输出一个类别。比如训练猫狗的分类器&#xff0c;如果你抛出一个人的图像&#xff0c;网络也会将其分类为猫或者狗。 在几乎所有现实世界的问题中…

【论文阅读】Self-supervised Learning: Generative or Contrastive

Abstract 研究了在计算机视觉、自然语言处理和图形学习中用于表示的新的自监督学习方法。全面回顾了现有的实证方法&#xff0c;并根据其目的将其归纳为三大类&#xff1a;生成性、对比性和生成性对比&#xff08;对抗性&#xff09;。进一步收集了关于自我监督学习的相关理论…

亚信安慧AntDB超融合数据库:拓展亿级用户系统的智能化新纪元

在面对亿级用户规模的系统建设需求时&#xff0c;传统数据库往往面临诸多挑战。为了满足多样化的技术要求&#xff0c;项目通常需要倚赖多套技术体系&#xff0c;例如&#xff0c;一套关系型数据库用于元数据管理和标签化管理&#xff0c;另一套则专注于非结构化文件的处理。这…

软件测试|深入了解PyCharmDebug功能:逐步调试Python代码

简介 PyCharm作为一款强大的Python集成开发环境&#xff0c;提供了丰富的调试功能&#xff0c;可以帮助开发者轻松定位和解决代码问题。本文将详细介绍如何在PyCharm中使用Debug功能&#xff0c;并通过示例演示其实际应用。 debug 步骤 打开项目&#xff1a; 打开PyCharm&…

因成本不断增加,阿里云发布区域调价公告|一周IT资讯

因成本不断增加&#xff0c;阿里云发布域名调价公告 1月9日晚&#xff0c;阿里云在官网发布域名调价公告&#xff1a;因注册局成本上调、域名实名制审核等服务成本不断增加&#xff0c;经慎重考虑&#xff0c;现决定于2024年2月1日&#xff0c;对 .net 英文域名进行价格调整&a…

关于自动化测试用例失败重试的一些思考

动化测试用例失败重跑有助于提高自动化用例的稳定性&#xff0c;那我们来看一下&#xff0c;python和java生态里都有哪些具体做法&#xff1f; 怎么做 如果是在python生态里&#xff0c;用pytest做测试驱动&#xff0c;那么可以通过pytest的插件pytest-rerunfailures来实现失…