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

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

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

一、引言

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

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

二、虚函数与多态性

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

三、override关键字

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

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

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

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

四、final关键字

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

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

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

2.修饰虚函数:当一个虚函数被声明为final时,它不能在派生类中被重写。这有助于确保某个特定的实现不被修改。QPQ28资讯网——每日最新资讯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则防止了不必要的继承和重写。这两个关键字不仅提高了代码的可读性和可维护性,还增强了程序的健壮性。在实际编程中,合理使用这些关键字可以使我们的代码更加清晰、准确和高效。QPQ28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top