记录C++类中的一次函数调用

引用

之前遇到一次函数调用结果的问题,今天在这里做一下记录。
一个基类,一个派生类,两个类中都有一个函数名相同,参数相同,参数不同的函数,创建基类指针指向派生类对象,调用相应的函数,派生类指针指向基类对象,调用相应的函数,求其输出结果。
具体看下面的示例。

示例

开发环境

visual Studio 2017控制台输出程序。创建项目后自动生成相应的main.cpp文件,本文的代码全部都是在main.cpp中编写。

示例代码

main.cpp

#include <iostream>
using namespace std;class TransferBase 
{
public://int Fun() { cout << endl; }//无法重载仅按返回值区分的函数Fun()void Fun() { cout << "TransferBase::Fun()" << endl; }virtual void Fun(int a) { cout << "TransferBase::Fun(int a)" << endl; }
private:
};class TransferDerived :public TransferBase
{
public:void Fun(int a) { cout << "TransferDerived::Fun(int a)" << endl; }//TransferDerived中的Fun(int a)与TransferBase中的Fun(int a)为多态,TransferDerived中的Fun(int a)与TransferBase中的Fun()为隐藏void Fun() { cout << "TransferDerived::Fun()" << endl; }//TransferDerived中的Fun()函数与TransferBase中的Fun()函数为隐藏关系
private:};int main()
{//类之间函数调用TransferBase *pBase =  new TransferDerived;TransferDerived *pDeri = dynamic_cast<TransferDerived*>(new TransferBase);//“dynamic_cast” : “TransferBase”不是多态类型	,基类指针转换为派生类指针的前提是基类必须有虚函数,否则编译错误;转换失败,派生类指针指向为nullptrpBase->Fun();pBase->Fun(2);//pDeri为nullptr,未转换成功 pDeri->Fun();//此句正常执行pDeri->Fun(3);//pDeri为nullptr,此句崩溃???
}

上述的代码,使用dynamic_cast将基类指针强转为派生类指针失败,其指针pDeri为空,运行pDeri->Fun(3);时出现崩溃,但是为什么在执行pDeri->Fun();的时候能正常执行呢???
原因:纯属意外。

dynamic_cast使用注意事项

1.用于类类型之间的强转。一般用于将基类指针转换为派生类指针,或将派生类指针转换为基类指针,但是将基类指针转换为派生类指针有一个前提:基类中必须要有虚函数
2.指针强转失败,返回值为nullptr.
上述main函数中创建派生类指针指向基类对象,一开始没有在基类中编写虚函数,因而编译的时候无法通过,在基类中增加了虚函数之后,TransferDerived pDeri = dynamic_cast<TransferDerived>(new TransferBase);才能编译通过。但上述派生类指针指向依旧为空,也就是基类的对象并没有强转成功。
其没转换成功的原因是:派生类继承自基类,含有基类的一些函数,可以自动转换为基类,而基类是不含有派生类中的函数,开辟的内存无法满足派生类的内存,直接访问会导致内存越界,故而无法直接转换为派生类。

为了使基类的对象转换为派生类对象,这时需要做下面的一些修改。

修改后的示例代码

上述使用dynamic_cast后没有成功将基类对象转换为派生类对象,这里先将基类的指针指向派生类对象,后将指向派生类对象的指针强转为派生类指针。下面是改动后的代码:

int main()
{
//类之间函数调用TransferBase *pBase =  new TransferDerived;TransferDerived *pDeri = dynamic_cast<TransferDerived*>(new TransferBase);//“dynamic_cast” : “TransferBase”不是多态类型	,基类指针转换为派生类指针的前提是基类必须有虚函数,否则编译错误;转换失败,派生类指针指向为nullptr//使基类指针转换为派生类指针转换成功——先将基类指针指向派生类对象,再将基类指针转换为派生类指针TransferDerived derive;TransferBase *base = &derive;pDeri = dynamic_cast<TransferDerived*>(base);//pDeri不为nullptr,基类指针转换为派生类指针成功//转换成功,pDeri不为nullptrpBase->Fun();pBase->Fun(2);pDeri->Fun();pDeri->Fun(3);
}

运行结果

在这里插入图片描述

总结

上述涉及到的知识点:
1.虚函数的使用;
2.隐藏、重载、重写的区别;
3.数据强转dynamic_cast.
以上是此篇文章需要具备的知识点。本文仅以记录。有关隐藏、重载、重写的介绍可以查看我之前的文章进行了解。

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

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

相关文章

bootstrap table移动端_bootstrap介绍

简介bootstrap是一款前端开发自适应页面的js库&#xff0c;可以让你在开发网页的时候轻松实现网站的PC与移动端兼容&#xff0c;避免在移动端上面出现样式错位等。原理bootstrap的原理是媒体查询CSS3的media&#xff0c;用于检测屏幕&#xff0c;从而改变样式的百分比。结构boo…

Spring Tool Suite 4 自动提示功能

文章目录一、java文件 自动提示二、JavaScript文件 自动提示三、HTML文件 自动提示四、导出配置文件五、编辑导出的配置文件5.1 java提示规则替换5.2 html提示规则替换六、导入配置好的文件一、java文件 自动提示 打开STS→Windows→Preferences→Java→Editor→Content Assis…

中立安全、赋能产业,UCloud优刻得凭差异化路线进军产业互联

2019年5月28日&#xff0c; 国内领先的中立云计算服务商UCloud优刻得&#xff08;以下简称UCloud&#xff09;在北京召开以“中立安全、赋能产业”为主题的UCloud用户大会暨Think in Cloud北京大会。面对走向纵深的产业互联网&#xff0c;UCloud强调做“不和用户竞争的云”&…

Spring Tool Suite 4 添加反编译插件

文章目录一、进入商店市场二、查找插件&#xff0c;输入jad搜索三、点击安装四、接收协议、安装五、重启Spring Tool Suite 4六、效果图一、进入商店市场 二、查找插件&#xff0c;输入jad搜索 三、点击安装 四、接收协议、安装 五、重启Spring Tool Suite 4 六、效果图

Hadoop精华问答 | NameNode是什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce。到现在的13个年头,这个单词代表的是“核心”&#xff0c;今天我们就来看看关于Hadoop的精华问答。1Q&#xff1a;NameNode是什么&#xff1f;A&…

01_SpringCoud 整合SpringCoud alibaba Nacos

SpringCoud 核心 整合SpringCoud alibaba Nacos 文章目录一、快速构建一个SpringBoot项目二、添加依赖2.1 SpringMVC2.2 nacos客户端2.3 lombok(可以省略)2.4 actuator监控(图形化)2.5 SpringCloud和spring-cloud-alibaba三、添加注解(无)四、写配置信息五、下载和运行nacos5.1…

C++线程处理函数的返回值

引言 关于线程处理函数&#xff0c;常见的可能是返回值为void类型&#xff0c;那线程处理函数是否能定义自己想要的返回值类型呢&#xff0c;这里请看下面的说明。 C线程返回值 应用环境1、传统的方式获取线程返回值2、使用C Promise和future方式3、promise和future介绍 应…

华为在欧注册HUAWEI ARK OS商标或为海外版操作系统命名;联通电信正探索合并?汽车共享品牌car2go近宣布退出中国……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 一加 7 Pro &#xff…

ip访问次数统计 nginx_PHP实现IP访问限制及提交次数的方法详解

一、原理提交次数是肯定要往数据库里写次数这个数据的&#xff0c;比如用户登陆&#xff0c;当用户出错时就忘数据库写入出错次数1&#xff0c;并且出错时间&#xff0c;再出错写2&#xff0c;当满比如5次时提示不允许再登陆&#xff0c;请明天再试&#xff0c;然后用DateDiff计…

C++容器deque的用法

目录 1.deque容器概念 2.deque对象的构造 2.1deque对象的默认构造 2.2deque对象的带参数构造 3.deque头部和末尾的添加移除操作 4.deque的数据存取 5.deque与迭代器 6.deque的赋值 7.deque的大小 8.deque的插入 9.deque的删除 1.deque容器概念 deque容器概念 deque是…

AI时代,中国技术创新如何弯道超车?

2019 年 5 月 26 日 - 27 日&#xff0c;杭州国际博览中心&#xff0c;由工信部人才交流中心指导&#xff0c;CSDN 和数字经济人才发展中心主办的 CTA 核心技术及应用峰会圆满落下帷幕。本次大会聚焦机器学习、知识图谱等 AI 领域的热门技术&#xff0c;关注技术在行业中的实践…

JBOSS7启动与关闭

1.启动 进入Jboss的bin目录下 通过以下命令启动jboss ./standalone.sh启动没有问题&#xff0c;但是当你按你ctrl C退出后&#xff0c;jboss服务也关闭了&#xff0c;所以我们要使用后台启动方式&#xff1a; nohup ./standalone.sh&查看Jboss启动进程&#xff1a; tai…

容器云常见安全威胁与防范 | 技术干货

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;除了应对常见云平台和传统数据中心常见的安全威胁&#xff0c;容器云平台还存在一些自…

开启灯光就是近光吗_有用!科目三灯光模拟操作大全

科三考试第一项就是灯光模拟考试&#xff0c;要求考生在5秒之内根据相关语音播报完成相应操作。不少学员在这一项中出错&#xff0c;以至于科三考试还没开出几米就挂了&#xff01;今天通妹特地整理了灯光操作相关技巧&#xff0c;希望大家顺利通过科三第一关&#xff01;语音提…

vmware安装问题:Microsoft Runtime DLL安装程序未能完成安装

文章目录一、vmware安装问题&#xff1a;Microsoft Runtime DLL安装程序未能完成安装1.1 在输入%temp%1.2. 找到{ADC3121A-3EBA-4016-AF64-00B8FE017080}~setup结尾是~setup1.3. 打开该文件夹选择安装程序即可正常安装。一、vmware安装问题&#xff1a;Microsoft Runtime DLL安…

雾计算精华问答 | 雾计算与云计算的区别?

物联网对于数据的处理能力要求很高&#xff0c;怎么能够从庞大的数据海中挖掘一些有价值的信息对于物联网的发展至关重要&#xff0c;因此云计算&#xff0c;雾计算&#xff0c;边缘计算等等都将发挥其左右。今天先让我们来了解一下雾计算吧。1Q&#xff1a;雾计算是如何构成的…

【解决】-bash: ftp: command not found

今天在centos上使用ftp命令连接本机的FTP服务器&#xff08;本机FTP服务使用Vsftpd搭建&#xff09;&#xff0c;出现如下的错误提示&#xff1a;-bash: ftp: command not found 查询相关资料&#xff0c;发现很有可能是FTP命令没有安装。 通过yum方式安装FTP命令: yum insta…

kodi pvr 不能安装_「保姆级教程」家庭影音多媒体中心第5节—KODI18安装/设置IPTV...

一、本章前言&#xff1a;上一章节万晓博SEO带领大学习安装了kodi18播放群晖NAS或者本地视频教程&#xff0c;本节课我们讲讲如何使用kodi播放器看IPTV央视/地方卫视频道&#xff0c;我们遐想下&#xff0c;如果我们使用kodi播放IPTV&#xff0c;这样既可以播放群晖nas或者本地…

使用云原生buildpacks将你的代码转换成Docker Image | 技术干货

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;七年前buildpack技术开源之时&#xff0c;我们就看到了这项技术将大大简化应用的发布过…

Windiws环境安装轻量级文件服务器ftpserver

Windiws环境安装轻量级文件服务器ftpserver 文章目录1. 在线下载&#xff1a;2. 解压3. 以管理员身份运行4. 启动5. 浏览器验证6. 输入账号和口令7. 创建测试文件8. 验证效果图1. 在线下载&#xff1a; 点击即可下载&#xff1a;http://learning.happymmall.com/ftpserver/FTP…