c++重载函数和虚函数(重写)为什么分别在编译和运行时候确定

news2024/11/19 16:38:05

函数调用的本质:

  • 函数调用实际上是执行函数体中的代码
  • 函数体是内存中的一个代码段
  • 函数名代表改代码段的首地址,函数执行时就从这里开始

所以执行一个函数的时候,需要知道具体的函数地址,才能执行函数

重载、重写和隐藏的区别

(1)重载(静态联编)指的是同一个名字的函数,必须具有不同的参数列表(参数类型、个数),可以有不同的返回类型,根据参数列表和返回类型决定调用哪一个函数;(函数名可以相同,但是参数不能完全相同,至于返回值,不影响重载。所以函数倾轧不使用返回值信息)

(2)重写(覆盖,动态联编)指的是,派生类中的函数重写了基类中的虚函数,重写的基类的中函数必须被声明为virtual,并且返回值,参数列表和基类中的函数一致;

(3)隐藏是指,派生类中的同名函数把基类中的同名函数隐藏了,即基类同名函数被屏蔽掉;此时基类函数不能声明为virtual。

实际上在c++中,无论重载还是重写,最终都会生成多个不同的函数,这些函数虽然在代码上看起来名字相同,实际上是名字不同的多个函数,对于重载,c++使用函数倾轧技术,在ide看来,重载的不同函数的参数和返回值都会使得经过函数倾轧后表现的不同,重写更不必说,不同虚函数表指向的函数显然不同。

对于重写,其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致,所以在代码编写过程中,我们的调用代码完全相同:

#include <iostream>
using namespace std;
class A {
public:
    A() { cout << "A" << endl; }
    virtual void AB_test() { cout << "A_test" << endl; }
    //~A() { cout << "~A" << endl; AB_test(); }//case 3
    virtual ~A() { cout << "~A" << endl; AB_test(); }//case 4
};

class B :public A {
public:
    B() { cout << "B" << endl; }
    ~B() { cout << "~B" << endl; AB_test(); }
    virtual void AB_test() { cout << "B_test" << endl; }
};
int main()
{
    A* myObject= new A;
    A* temp = myObject;
    myObject->AB_test();
    myObject = new B;
    myObject->AB_test();
    cout << "Than delete" <<endl;
    delete temp;
    delete myObject;
    return 0;
}

执行结果:

在这里插入图片描述

关于其中构造和析构调用看不懂的可以看我的这篇文章:

C++继承机制下析构和构造函数的执行分析

可以看到,myObject->AB_test()的两次调用代码完全相同,那如果这两次调用的时候要在运行期间读取文本信息readRawData()来确定myObject->AB_test()到底执行基类还是子类中的函数,这将使用完全相同的代码,但行为却要在运行期才能确定,所以重写自然地成为动态联编,行为确定在运行期。

重载则完全不同,它具有不同的形参列表,也就睡说实际上在编写代码的时候,就已经确定了行为,因为你需要指定参数来确定调用哪一个重载的函数,自然其行为在编译期已经确定,是静态行为。

关于函数倾轧,简单的说就是根据函数名和参数列表将参与重载的函数实际上又赋予了不同的名字,例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXZSzXQq-1687857233730)(C:\Users\21131\AppData\Roaming\Typora\typora-user-images\image-20230627171032672.png)]

上图来自这篇博客,引用一下供大家参考,具体请见大佬博客:

C++函数重载及原理(命名倾轧name mangling)小记

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

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

相关文章

大家想知道ai写作宝怎么样吗?

ai写作是指利用人工智能技术自动生成文章、报告、新闻等文本内容的过程。它可以实现大规模、高效率、低成本的文本创作&#xff0c;免去人工编写的繁琐过程&#xff0c;节约了很多时间和精力。目前在文学创作、新闻报道、广告文案、社交媒体内容创作等方面&#xff0c;ai写作都…

mysql中将多行数据合并成一行数据

mysql中将多行数据合并成一行数据 一个字段可能对应多条数据&#xff0c;用mysql实现将多行数据合并成一行数据 例如&#xff1a;一个活动id&#xff08;activeId&#xff09;对应多个模块名&#xff08;modelName&#xff09;,按照一般的sql语句&#xff1a; SELECT am.act…

英伟达,不止于GPU

光子盒研究院 2013年至2023年这十年&#xff0c;有一家公司的市值翻了115倍、一跃成为美国股市回报率最高的公司——这就是英伟达。 黄仁勋出生于中国台湾&#xff0c;四岁随父母移民美国。1984年大学毕业&#xff0c;获得俄勒冈州立大学和斯坦福大学工程学位。 1993年&#xf…

《九》TypeScript 中的内置工具

TypeScript 内置了很多类型工具&#xff0c;来辅助进行类型转换。 Partial<Type>&#xff1a; Partial<Type>&#xff1a;用于构造一个所有属性都为可选属性的类型。 interface IPerson {name: stringage: number }// personOptional 类型的所有属性都是可选的 …

C++11【二】

文章目录 一、lambda表达式二、线程库三、包装器四、绑定&#xff08;不常用&#xff09; 一、lambda表达式 如果待排序元素为数据集合中的元素和自定义类型&#xff0c;需要用户定义排序时的比较规则不同如下代码&#xff0c;但都可以使用sort方法&#xff0c; #include <…

前端Vue3使用Moment Timezone处理不同时区时间

文章目录 前言一、基本时间概念UTC &#xff0c; GMT本地时间 为了方便比较&#xff0c;图中黑色背景的是 中国&#xff08;China&#xff09;区电脑&#xff0c;白色主题背景的是美国&#xff08;US&#xff09;区电脑&#xff09;2023-06-27T14:00:00.000Z 二、实际案例表单填…

正确认识:DOTA-E[c(RGDyK)2],DOTA标记序列多肽,双环肽螯合物

试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DOTA-E[c(RGDyK)2]为双环肽螯合物&#xff0c;DOTA标记序列多肽&#xff0c;螯合物前体多肽&#xff1a;放射性金属元素&#xff0c;例如&#xff1a; Cu、 Ga、 Lu、等可以通过与…

0基础入门---第四章---神经网络的学习

&#x1f31e;欢迎来到深度学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

【突发小技巧】手动将jar包导入本地Maven仓库

1、下载jar包 以支付宝sdk为例&#xff1a;https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java/4.33.12.ALL 后面执行mvn install命令(也就是安装命令&#xff0c;生命周期&#xff1a;编译、测试、打包、安装)&#xff0c;也会参考这个依赖坐标&#xff1a; …

前端安全 - 保护你的应用免受攻击的关键

80. 前端安全 - 保护你的应用免受攻击的关键 作为前端工程师&#xff0c;我们不仅需要关注用户界面的设计和功能实现&#xff0c;还需要关注应用程序的安全性。前端安全是保护我们的应用程序免受恶意攻击和数据泄露的重要方面。本文将介绍前端安全的概念、常见的安全威胁以及一…

Linux集群服务器上运行命令的4个实用工具

目录 1. PSSH-Parallel SSH 安装parallel-ssh&#xff0c; 使用 2. Pdsh-并行远程Shell实用程序 3. ClusterSSH 安装 4. Ansible 我们假设你已经设置好了SSH以便访问所有服务器;其次假设&#xff0c;同时访问多台服务器时&#xff0c;在所有Linux服务器上设置基于密钥的无…

clone浅拷贝

通过一个实例对象 生成另一个对象&#xff0c;称为 拷贝。 需要 实现 java.lang.Cloneable 该接口是一个 标记接口 通过调用 clone() 方法&#xff0c;完成 对象拷贝。该方法是Object类中的方法&#xff0c;所有对象都继承该方法。 clone()方法是 浅拷贝&#xff0c;也就是 只…

Vue+vite创建项目关于vite.config.js文件的配置

Vuevite创建项目关于vite.config.js文件的配置 Vue项目创建时&#xff0c;我们见过vue-cli 创建项目和webpack 创建项目等方式。 现在Vue 3版本使用npm/pnpm create vuelatest 创建项目&#xff0c;是搭配使用vite工具构建的。 创建完成的项目&#xff0c;最明显的去别就是&am…

【硬件自动化软件设计及实现】如何设计并实现!

今天来聊聊关于硬件方向的自动化软件设计及实现,后面我会用实例来让我们更加深入的了解硬件自动化,首先开发工具选择的是python语言,为啥选择python语言呢,因为他的语法比较简洁,外置库非常多,反正就是对于做自动化方面很实用就对了。 1.硬件自动化测试大致分为三个阶段实…

Redis 来了,Navicat 用户炸开了锅 | 文末附免单王获奖名单

近期&#xff0c;Navicat 的后台热闹无比&#xff01;自 2023 年 5 月 Navicat Premium 16.2 Beta 中文版上线以来&#xff0c;童鞋们的留言如潮水般涌来。6 月中旬&#xff0c;我们正式发布了 Navicat Premium 16.2 与 Navicat for Redis&#xff0c;赋予了Navicat 更卓越的功…

JMeter工具接口性能压力测试分析与优化

目录 前言&#xff1a; 一、具体测试结果如下&#xff1a; 二、初始应用配置调整&#xff1a; 三、分析解决过程&#xff1a; 总结&#xff1a; 前言&#xff1a; 最近公司做的项目&#xff0c;要求对相关接口做性能压力测试&#xff0c;在这里记录一下分析解决过程。 压…

[Pytorch]导数与求导

文章目录 导数与求导一. 标量 向量 矩阵 的导数二.Pytorch中的反向求导.backward()三.非标量求导 导数与求导 一. 标量 向量 矩阵 的导数 标量&#xff0c;向量&#xff0c;矩阵间求导后的形状&#xff1a; y\x标量x(1)向量 x(n,1)矩阵 X(n,k)标量y(1)(1)(1,n)(k,n)向量 y(m…

Unity Image/GL实现一个框选功能吧

场景准备 准备一张框选背景图 导入到unity之后&#xff0c;修改 Texture Type 为 Sprite&#xff0c;&#xff08;根据图片需要&#xff09;在 Sprite Editor 中 编辑 九宫格格式。图片样式的不一致&#xff0c;设置的九宫格格式也不一致。本例中虚线部分需要等距离平铺&…

Visual C++类的继承及类中成员的访问特性——搞懂public、protected、private

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中类的继承及类中成员的访问特性&#xff0c;也就是来搞懂public、protected、private这三个东西。 很多人搞不清楚这三个东西&#xff0c;并且很容易弄错&#xff0c;其实不是学习的人的…

vr全景在线虚拟展馆节约企业成本费用

博物馆作为人们了解历史、文化和艺术的重要场所&#xff0c;现在可以通过VR全景技术来进行展览&#xff0c;让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势&#xff0c;以及如何使用VR全景技术来使得博物馆的展览和教育活动更丰富。 参观者可以对内…