前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++ 中为什么需要虚函数

C++ 中为什么需要虚函数

作者头像
ClearSeve
发布于 2022-02-10 12:52:05
发布于 2022-02-10 12:52:05
92800
代码可运行
举报
文章被收录于专栏:ClearSeveClearSeve
运行总次数:0
代码可运行

问题

我最近正在学习 C++ 的虚函数,我知道虚函数是用于子类继承的,但虚函数什么时候才需要用它?因为我发现有的教科书上有用 virtual,有的又不用,我有点搞混了。

回答

下面我解释下 virtual 的必要性。

先来看两个类,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal
{
    public:
        void eat() { std::cout << "I'm eating generic food."; }
};

class Cat : public Animal
{
    public:
        void eat() { std::cout << "I'm eating a rat."; }
};

接着在主函数中使用,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Animal *animal = new Animal;
Cat *cat = new Cat;

animal->eat(); // Outputs: "I'm eating generic food."
cat->eat();    // Outputs: "I'm eating a rat."

目前为止看起来都正常。

现在我们再通过函数来调用,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void func(Animal *xyz) { xyz->eat(); }

主函数中调用,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Animal *animal = new Animal;
Cat *cat = new Cat;

func(animal); // Outputs: "I'm eating generic food."
func(cat);    // Outputs: "I'm eating generic food."

这就不对了,明明我传入的是 Cat 类型。难道还需要单独为 Cat 重载 func 函数么?如果以后再加入子类 Dog 呢?

解决方案就是使用 virtual 函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal
{
    public:
        virtual void eat() { std::cout << "I'm eating generic food."; }
};

class Cat : public Animal
{
    public:
        void eat() { std::cout << "I'm eating a rat."; }
};

func(animal); // Outputs: "I'm eating generic food."
func(cat);    // Outputs: "I'm eating a rat."
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
相关问题请去问答社区提问:https://cloud.tencent.com/developer/ask
相关问题请去问答社区提问:https://cloud.tencent.com/developer/ask
回复回复点赞举报
推荐阅读
处境艰难的 App 开发者们如何自救
这是我朋友的公司不再研发原生 App 的原因——在网页端创业简单的多。怎么会这样呢?基于浏览器的网页端生态系统已经存在了 20 多年,而 App 系统却仅存世 6 年。可以肯定的说,这并不是因为网站数量少于 App 。 我的脑海中浮现出「饱和」这两个字。如果你还记得高中化学,你应该知道饱和是一种不再溶解新物质的状态。比如,你一边搅拌一边不停往水里加盐,直到溶液饱和。如果你继续向水中加盐,无论你如何大力又快速地搅拌,这些盐都会沉到杯底。因为在其中某个时刻,水中已经溶解了足够的盐。 为什么手机 App 已经趋于
非著名程序员
2018/02/08
8530
处境艰难的 App 开发者们如何自救
Autojs - 用 JavaScript 实现自己的安卓手机自动化工具脚本
这个软件叫做 Auto.js,只支持安卓,是一个不需要 Root 权限的 JavaScript 自动化软件。什么意思呢,就是在你的安卓手机上安装这个 APP,然后通过编写 JS 脚本的方式实现自动化操作。类似的也有其他的一些软件,比如苹果自带的快捷操作,可以通过自定义配置完成一系列的流程,但是由于其目标是所有人都可以使用,所以定制的时候就没有那么灵活。
古时的风筝
2020/05/18
20.4K2
Autojs - 用 JavaScript 实现自己的安卓手机自动化工具脚本
uniapp开发App从开发到上架全过程
​当我们的APP开发完毕,最终交付的时候,必然要经历的一个环节,就是APP上架,国内APP上架一般为IOS端appstore上架,安卓端应用商店比较多,最常见的应用商店有华为应用商店、小米应用商店、OPPO应用商店、VIVO应用商店、应用宝应用商店等。
iOS Magician
2023/11/30
5540
uniapp开发App从开发到上架全过程
安卓模拟器打开开发者模式(USB调试)的方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/03
5.2K0
安卓模拟器打开开发者模式(USB调试)的方法
HTML5定稿:手机App将三年内消失
就像Apple成立前,HP的高层告诉沃兹:谁会在家里摆一台电脑呢?未来HTML5肯定会颠覆原生App。2007年W3C(万维网联盟)立项HTML5,直至2014年10月底,这个长达八年的规范终于正式封
用户7705674
2021/09/19
4670
Auto.js脚本开发环境搭建
直接将APK发送到安卓手机上进行安装,电脑端的模拟器上直接拖进去就可以安装,安装时不光要安装Auto.js的APK,还要安装打包插件的APK,Auto.js的APK安装完成后桌面上是有图标的,而打包的插件安装完成后是没有图标的。
越陌度阡
2022/07/28
4K0
Auto.js脚本开发环境搭建
xamarin.forms uwp app部署到手机移动设备进行测试,真机调试(device portal方式部署)
最近学习xamarin。刚好 手上有一个lumia 930.所以试一试把uwp app部署到手机上,并真机调试一把。
旺财的城堡
2018/11/20
1.3K0
开发者必知的8款App快速开发工具
“我有一个好创意,就差一个CTO……” “原生APP开发难度大,周期长,成本高,还没上线市场已经被占领了。” “APP版本迭代更新,都是企业的一道难关,没有一个一劳永逸的解决方式吗?” “一个Web开发者如何能快速适应移动互联网时代,用HTML5开发出一个APP呢?” “安卓、IOS双平台同时开发,程序员都累死在加班的路上了……” 针对行业痛点,国内外涌现出众多APP开发工具,开发者只要有相关的HTML5、CSS和JavaScript知识,便可以轻松快速的开发出属于自己的APP,基于开发工具中众多的模块功能
非著名程序员
2018/02/08
6.5K0
开发者必知的8款App快速开发工具
win10使用WSL编译Linux C++项目
我们是做后台开发的,虽然我们的svr都泡在tlinux上,但是大部分同学写代码/看代码还都是在windows下。
breezeliu
2018/11/04
9.8K0
小米手机_如何打开开发者模式?[通俗易懂]
大多数手机的开发者模式按钮都在更多设置中,但是小米手机有些不一样,更多设置中没有展示开发者选项,那么小米手机怎样打开开发者模式呢?
全栈程序员站长
2022/09/21
3.8K0
小米手机_如何打开开发者模式?[通俗易懂]
电脑使用 Vysor 控制手机
想用安卓手机一步一步演示个东西给别人看的时候,恰巧遇到对方不在身边;安卓手机上的东西想投影到 Windows 电脑上,用电脑控制手机,却没找到合适的方式;上班时间想摸鱼,用手机又太明显了。那么 Vysor 就是一个挺好的选择。
伪君子
2018/12/19
3K0
电脑使用 Vysor 控制手机
App自动化测试之Appium环境搭建
Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。支持多种语言。
小博测试成长之路
2021/03/08
2K0
App自动化测试之Appium环境搭建
Ionic3 Android调试
本文主要介绍将Ionic项目打包成安卓应用之后的调试过程,调试方式分两种:模拟器调试、真机调试。不过在此之前,必须要将ionic项目成功打包成Android应用,有关 ionic打包成Android应用的具体教程,请参考以下文章: Ionic3 Android打包
spilledyear
2018/08/21
1.2K0
Ionic3 Android调试
准备好迎接后 App 时代了吗?
2007 年 1 月 9 日,iPhone 发布会召开;6 月 29 日,iPhone 正式上市。4 个月后,Google 与众多手机厂商结盟,成立了 OHA 联盟,以开放的 Android 对抗 iPhone。 在 2 个阵营的互搏中,移动互联网拉开了为期 10 年的疯狂增长。 10 年后的今天,移动互联网已经从增长期过渡到平稳期,我们的生活被极大地改变。然而,有些显而易见的不合理又一直存在: 对用户而言,为什么移动互联网服务不能像 PC 那样触手可及? 对开发者而言,为什么流量越来越贵,变成少数寡头的
CSDN技术头条
2018/02/12
1.4K0
准备好迎接后 App 时代了吗?
如何root手机-记录我的第一次刷机
平时自己学习Wifi知识,避免不了要测试抓log,所以一个root权限的手机很有必要,之前一直借用别人的手机,最近把自己的手机root了,这里记录一下。 我的手机是小米6,小米手机系统是分为稳定版和开发版的,现在小米官网下载了一个开发板系统。
用户7557625
2020/07/15
2.5K0
如何root手机-记录我的第一次刷机
前端工程师用Node.js + Appium实现APP自动化
最近在使用Appium做爬虫功能,网上全是python + Appium的教程,Appium也支持Node.js开发,作为前端工程师使用Node.js + Appium实现了自动化爬虫功能。
100000996525
2023/08/02
1.2K0
前端必须知道的开发调试知识 - 笔记
小技巧:不同类型的数据从 console 中打印出的颜色也不相同,可以借此判断数据类型
TagBug
2023/03/17
1.2K0
前端必须知道的开发调试知识 - 笔记
手机数据传输安全分析
如今手机已经成了我们离不开的伙伴和知己,它了解我们的日常生活。然而每一天在路上的时候,它都会收集我们的私密信息。平时我们会用它拍照,在社交网络中分享我们的心情;我们也用它发送邮件、短信以及拨打电话。所以,这些信息则让我们的智能手机成为黑客眼热的宝库。 普通用户的安全概念 最重要的是,我们中大多数人相信手机中的数据是绝对安全的。毕竟手机制造商曾向我们保证过,而且他们也给我们提供了安全补丁和更新升级包。 我们自己也会采取措施来保护自己的隐私,比如自定义安装固件、挖掘操作系统机制、刷机获得root权限,以便更
FB客服
2018/02/08
1.2K0
手机数据传输安全分析
云原生应用管理,像管理手机APP一样管理企业应用
我们在使用智能手机的时候,手机APP从应用市场一键安装,安装好即点即用,当有新版本一键升级,如果不想用了长按图标删除,整个过程非常简单,小朋友都能熟练掌握。而对于企业应用,由于结构复杂、可用性要求高、配置多等特点,导致企业应用的管理工作异常复杂。企业内部一般都会有专门的运维工程师来负责保障企业应用的正常运行。
Rainbond开源
2021/12/13
1.2K0
云原生应用管理,像管理手机APP一样管理企业应用
Appium移动端自动化测试--搭建模拟器和真机环境
推荐直接安装Android Studio,然后使用Android Studio安装SDK。 启动SDK Manager,安装自己所需要的版本,下载安装即可。
软测小生
2020/02/13
4K0
Appium移动端自动化测试--搭建模拟器和真机环境
推荐阅读
相关推荐
处境艰难的 App 开发者们如何自救
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档