当前位置:首页 > 科技  > 软件

C++中的显式虚函数重载:override与final详解

来源: 责编: 时间:2024-04-15 18:11:20 276观看
导读一、引言在C++中,多态性是面向对象编程的三大特性之一,而虚函数是实现多态的重要手段。随着C++11标准的推出,C++引入了override和final两个关键字,它们为虚函数的重载和继承提供了更明确的语义和控制。本文将深入探讨这两

一、引言

在C++中,多态性是面向对象编程的三大特性之一,而虚函数是实现多态的重要手段。随着C++11标准的推出,C++引入了override和final两个关键字,它们为虚函数的重载和继承提供了更明确的语义和控制。本文将深入探讨这两个关键字的用法和意义。m8L28资讯网——每日最新资讯28at.com

m8L28资讯网——每日最新资讯28at.com

二、虚函数与多态性

在C++中,虚函数(virtual function)允许子类重写父类中的函数,从而实现多态性。多态性意味着可以使用父类指针或引用来调用子类对象中重写的函数。这是通过动态绑定(dynamic binding)实现的,即在运行时确定调用哪个类的函数。m8L28资讯网——每日最新资讯28at.com

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;    }};

在这个例子中,Base类定义了一个虚函数func(),而Derived类重写了这个函数。当我们通过Base类的指针或引用来调用func()时,将调用相应对象实际类型的func()函数,这就是多态性的体现。m8L28资讯网——每日最新资讯28at.com

三、override关键字

在C++11之前,如果子类想要重载父类的虚函数,编译器并不会提供太多的帮助来确保重载的正确性。有时可能因为参数列表或返回类型的微小差异而导致重载失败,但编译器可能并不会给出明确的错误信息。m8L28资讯网——每日最新资讯28at.com

C++11引入了override关键字,它显式地告诉编译器:这个函数是重载父类的虚函数。如果该函数没有正确重载父类的虚函数(例如参数列表或返回类型不匹配),编译器将给出错误信息。这大大提高了代码的可读性和健壮性。m8L28资讯网——每日最新资讯28at.com

class Derived : public Base {public:    void func() override { // 使用override关键字        std::cout << "Derived::func()" << std::endl;    }};

在这个例子中,如果Derived::func()的签名与Base::func()不匹配,或者Base::func()不是虚函数,编译器将给出错误提示。m8L28资讯网——每日最新资讯28at.com

四、final关键字

final关键字在C++中有两种用法:一是修饰类,表示该类不能被继承;二是修饰虚函数,表示该函数不能被重写。m8L28资讯网——每日最新资讯28at.com

1.修饰类:当一个类被声明为final时,它不能被其他类继承。这有助于确保类的设计不被意外破坏或误用。m8L28资讯网——每日最新资讯28at.com

class MyFinalClass final { // 使用final关键字修饰类    // ...};// 下面的代码将导致编译错误,因为MyFinalClass不能被继承// class DerivedFromFinal : public MyFinalClass { };

2.修饰虚函数:当一个虚函数被声明为final时,它不能在派生类中被重写。这有助于确保某个特定的实现不被修改。m8L28资讯网——每日最新资讯28at.com

class Base {public:    virtual void func() {        std::cout << "Base::func()" << std::endl;    }};class Derived : public Base {public:    void func() final { // 使用final关键字修饰虚函数        std::cout << "Derived::func()" << std::endl;    }};// 下面的代码将导致编译错误,因为Derived::func()已经被声明为final,不能被重写// class Derived2 : public Derived {// public://     void func() override { } // 尝试重写final函数,将导致编译错误// };

五、结论

C++11引入的override和final关键字为虚函数的重载和类的继承提供了更强大的控制。override确保了我们正确地重写了父类的虚函数,而final则防止了不必要的继承和重写。这两个关键字不仅提高了代码的可读性和可维护性,还增强了程序的健壮性。在实际编程中,合理使用这些关键字可以使我们的代码更加清晰、准确和高效。m8L28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-83617-0.htmlC++中的显式虚函数重载:override与final详解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 揭秘Python中的JSON数据格式与Requests模块

下一篇: 从 React 新官网学到的一个优秀实践妙招

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
Top