网易首页 > 网易号 > 正文 申请入驻

C++中的虚函数与纯虚函数区别详解

0
分享至

一、引言

在C++中,多态性是面向对象编程的三大特性之一,它允许我们使用共同的接口来操作不同类型的对象。虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)是实现多态性的关键工具。本文将详细解释这两种函数的概念、用法以及它们在C++编程中的重要性和应用场景。



二、虚函数的概念

虚函数是C++中实现动态多态性的一种机制。在基类中,我们可以将某个成员函数声明为虚函数,这意味着在派生类中该函数可以被重写(override)。当通过基类指针或引用调用该函数时,将会调用相应对象实际类型的函数实现,而不是基类中的实现。这就是动态绑定或运行时多态性的基础。

代码示例:

class Base {public:    virtual void func() { // 虚函数        std::cout << "Base::func()" << std::endl;    }};class Derived : public Base {public:    void func() override { // 重写基类中的虚函数        std::cout << "Derived::func()" << std::endl;    }};int main() {    Base* ptr = new Derived(); // 基类指针指向派生类对象    ptr->func(); // 调用的是Derived类的func()函数    delete ptr;    return 0;}

重点内容: 在上面的代码中,Base类中的func()函数被声明为虚函数。在Derived类中,我们重写了这个函数。在main()函数中,我们创建了一个Derived类的对象,但是通过一个Base类的指针来访问它。当我们通过这个指针调用func()函数时,实际上调用的是Derived类中的实现,这就是动态多态性的体现。

三、纯虚函数的概念

纯虚函数是一种特殊的虚函数,它在基类中没有实现(或者说实现为空)。包含纯虚函数的类是抽象类,不能被实例化。纯虚函数的作用是在基类中定义一个接口,要求所有派生类都必须实现这个接口。这样,基类就成了一个抽象基类,用于定义一组接口,而具体的实现则留给派生类来完成。

代码示例:

class AbstractBase {public:    virtual void pureFunc() = 0; // 纯虚函数};class ConcreteDerived : public AbstractBase {public:    void pureFunc() override { // 必须实现基类的纯虚函数        std::cout << "ConcreteDerived::pureFunc()" << std::endl;    }};int main() {    // AbstractBase ab; // 错误!抽象类不能被实例化    ConcreteDerived cd; // 正确,因为提供了pureFunc()的实现    cd.pureFunc(); // 调用的是ConcreteDerived类的pureFunc()函数    return 0;}

重点内容: 在上面的代码中,AbstractBase类包含了一个纯虚函数pureFunc(),这使得AbstractBase成为了一个抽象基类,不能被实例化。ConcreteDerived类继承了AbstractBase,并提供了pureFunc()的具体实现。在main()函数中,我们创建了一个ConcreteDerived类的对象,并调用了其pureFunc()函数。注意,我们不能直接实例化AbstractBase类,因为它包含纯虚函数。

四、虚函数与纯虚函数的应用场景

虚函数和纯虚函数在C++编程中有着非常广泛的应用。它们允许我们编写更加灵活和可扩展的代码。例如,在设计一个游戏时,我们可以定义一个抽象的“角色”类(包含纯虚函数),然后为不同的角色类型(如玩家、敌人等)创建派生类。这样,我们就可以通过基类指针来统一处理不同类型的角色,同时保持代码的清晰和可扩展性。

虚函数和纯虚函数在C++中都是实现多态性的重要机制,但它们之间存在几个关键的区别。

1.函数实现

虚函数: 在基类中提供了函数的实现。派生类可以选择重写(override)这个函数,但也不是必须重写。如果派生类没有重写虚函数,那么当通过基类指针或引用调用该函数时,将会执行基类中的实现。

纯虚函数: 在基类中没有提供函数的具体实现(或者说实现为空),它仅仅声明了一个接口。派生类必须提供这个函数的实现,否则派生类也将成为抽象类,无法被实例化。

2.类的实例化

虚函数: 包含虚函数的类是可以被实例化的。

纯虚函数: 包含纯虚函数的类是抽象类,不能被实例化。只有当派生类实现了所有的纯虚函数后,派生类才能被实例化。

3.用途

虚函数: 通常用于实现“实作继承”,即继承接口的同时也继承了父类的一种可能实现。这种方式提供了一定的灵活性,允许派生类根据需要重写父类的方法。

纯虚函数: 关注于接口的统一性,它强制派生类提供具体的实现。这种方式用于定义一组接口,确保所有派生类都遵循相同的规范。

4.声明方式

虚函数: 在基类中使用virtual关键字声明,并提供函数体(即实现)。

纯虚函数: 在基类中使用virtual关键字声明,并在函数原型后面添加= 0来表示它是纯虚的,不提供函数体。

综上所述,虚函数和纯虚函数的主要区别在于它们的实现要求、对类实例化的影响、用途以及声明方式。虚函数提供了默认的实现,而纯虚函数则强制派生类提供实现,从而确保了接口的一致性。

五、结论

虚函数和纯虚函数是C++中实现多态性的关键工具。通过它们,我们可以编写出更加灵活、可扩展且易于维护的代码。掌握这些概念对于成为一名优秀的C++程序员来说是非常重要的。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
北京这一夜,人情世故、江湖地位,都在这张合照上体现得淋漓尽致

北京这一夜,人情世故、江湖地位,都在这张合照上体现得淋漓尽致

爱文历史
2024-06-19 16:28:25
53岁陈松伶瘦到90斤,胳膊细成老公一半,与小8岁张铎至今无一子

53岁陈松伶瘦到90斤,胳膊细成老公一半,与小8岁张铎至今无一子

娱乐白名单
2024-06-19 10:47:38
NVIDIA创历史成全球市值第一!低价套现的创始人血亏超1000亿美元

NVIDIA创历史成全球市值第一!低价套现的创始人血亏超1000亿美元

快科技
2024-06-19 17:33:24
懂什么叫外交豁免权吗?不好说,但坐外交使馆牌照车里并不享有

懂什么叫外交豁免权吗?不好说,但坐外交使馆牌照车里并不享有

不掉线电波
2024-06-19 16:16:33
北大硕士愿出500w证明姜萍作假:如果输了,愿意支付她未来学费

北大硕士愿出500w证明姜萍作假:如果输了,愿意支付她未来学费

熙熙说教
2024-06-19 15:53:51
昔日“彩电大王”走向没落,被美公司欠款40亿,如今沦为三线品牌

昔日“彩电大王”走向没落,被美公司欠款40亿,如今沦为三线品牌

李哥三观很正
2024-06-14 17:51:29
乌国防采购局前负责人披露:乌私下高价采购武器,某些武器价格被哄抬5倍

乌国防采购局前负责人披露:乌私下高价采购武器,某些武器价格被哄抬5倍

参考消息
2024-06-19 08:53:51
回顾一巴掌断送退休生活,公交打人大妈摊上事了,退休金也不够赔

回顾一巴掌断送退休生活,公交打人大妈摊上事了,退休金也不够赔

玲说百态味
2024-06-18 06:18:50
尴尬,国际乒联向王曼昱发来奥运单打邀请,但女单为孙颖莎、陈梦

尴尬,国际乒联向王曼昱发来奥运单打邀请,但女单为孙颖莎、陈梦

尘语者
2024-06-19 21:45:38
姜萍这事,其实不复杂

姜萍这事,其实不复杂

民言民语
2024-06-18 11:37:36
抽进死亡之组!日本女排遭遇2大克星,网友:打完小组赛就回家吧

抽进死亡之组!日本女排遭遇2大克星,网友:打完小组赛就回家吧

体坛知识分子
2024-06-19 20:10:53
江苏部署近期暴雨和强对流天气灾害防范应对工作

江苏部署近期暴雨和强对流天气灾害防范应对工作

金台资讯
2024-06-19 21:09:09
土地未获批仍上马 四川遂宁一游乐园被拆除 800万元损失谁买单?|云求助

土地未获批仍上马 四川遂宁一游乐园被拆除 800万元损失谁买单?|云求助

封面新闻
2024-06-19 17:05:34
比亚迪要把车险价格打下来了!博主:24万元腾势N7首年保费仅6500元,同价位宝马首年保费通常超万元

比亚迪要把车险价格打下来了!博主:24万元腾势N7首年保费仅6500元,同价位宝马首年保费通常超万元

和讯网
2024-06-19 10:25:51
新型卖淫方式,让人预想不到,但却真实存在!

新型卖淫方式,让人预想不到,但却真实存在!

雪影的情感
2023-11-18 11:51:16
乘客为体验国产大飞机购票却遇空客老机型执飞,要求赔差价遭拒

乘客为体验国产大飞机购票却遇空客老机型执飞,要求赔差价遭拒

澎湃新闻
2024-06-18 20:08:29
詹俊:克罗地亚本场漏洞百出,莫德里奇没老而布罗佐维奇老了

詹俊:克罗地亚本场漏洞百出,莫德里奇没老而布罗佐维奇老了

直播吧
2024-06-19 23:25:22
不会出口欧美!拜登做梦也没想到,中国出手会这么狠

不会出口欧美!拜登做梦也没想到,中国出手会这么狠

科技龙
2024-06-12 10:23:18
上海已婚少妇“脚踏四只船”,出轨全过程曝光,传疯了!

上海已婚少妇“脚踏四只船”,出轨全过程曝光,传疯了!

拾点先生
2024-06-17 20:14:40
要大结局了?仁爱礁菲舰出现6米大裂缝,坐滩人员已中断补给25天

要大结局了?仁爱礁菲舰出现6米大裂缝,坐滩人员已中断补给25天

胖福的小木屋
2024-06-17 23:57:30
2024-06-20 03:52:49
鲨鱼编程
鲨鱼编程
懂点技术,懂点编程
441文章数 155关注度
往期回顾 全部

科技要闻

618观察:谁为高强度的低价竞争买单?

头条要闻

丁进勇辞去越共中央政治局委员和河内市委书记职务

头条要闻

丁进勇辞去越共中央政治局委员和河内市委书记职务

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

深化科创板改革 证监会发布八条措施

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

艺术
游戏
本地
健康
数码

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

一个国产二次元角色,竟让老外集体亢奋沉沦,并语无伦次了起来?

本地新闻

中式沙拉宇宙的天花板,它必须有姓名

晚餐不吃or吃七分饱,哪种更减肥?

数码要闻

三星注册“990 EVO Plus”商标,有望推出新款固态硬盘

无障碍浏览 进入关怀版