C++ 11 新特性 override和final

news2024/11/17 23:25:22

一.override和final介绍

在C++11中,override和final是两个用于支持继承和多态的重要关键字。它们的具体作用如下:

  • override:这个关键字用于派生类中,以确保虚函数的正确重写。当一个派生类的函数被声明为override时,编译器会检查该函数是否正确地重写了基类中的虚函数。如果签名不匹配,则编译器会报错。这有助于避免由于函数签名错误而导致的继承错误,提高代码的安全性和可读性。
  • final:这个关键字有两个主要的用途。首先,它可以阻止一个类被进一步继承,即使用final修饰的类不能有派生类。其次,它也可以阻止虚函数在派生类中被进一步重写。使用final修饰的虚函数在派生类中不能有对应的重载版本。这有助于保护基类的设计,防止子类对继承关系进行不必要的修改或滥用。

二.使用override和final关键字使用示例:

(1)override关键字使用示例:

#include <iostream>

class Base {
public:
    virtual void foo()  {
        std::cout << "Base::foo()" << std::endl;
    }
};

class Derived1 : public Base {
public:
    void foo1() override {
        std::cout << "Derived1::foo()" << std::endl;
    }
};

int main() {
    Derived1 d1;
    d1.foo(); // 输cDerived1::foo()

    return 0;
}

运行结果:

Derived1类继承自Base类,并重写了foo()函数。在重写的函数前使用了override关键字,这告诉编译器该函数是覆盖基类中的虚函数。如果函数签名不匹配,编译器会报错。 

(2)override和final关键字同时使用示例: 

#include <iostream>

class Base {
public:
    virtual void foo() final {
        std::cout << "Base::foo()" << std::endl;
    }
};

class Derived1 : public Base {
public:
    void foo() override {
        std::cout << "Derived1::foo()" << std::endl;
    }
};

// 无法继承自Base类,因为Base类中的foo()函数被声明为final
// class Derived2 : public Base {
// public:
//     void bar() override {
//         std::cout << "Derived2::bar()" << std::endl;
//     }
// };

int main() {
    Derived1 d1;
    d1.foo(); // 输出:Derived1::foo()

    return 0;
}

运行结果:

 

        在上面的示例中,Base类定义了一个虚函数foo(),并使用final关键字修饰它。这意味着Base类不能有派生类,并且foo()函数在派生类中也不能被重写。

由于Base类中的foo()函数被声明为final,所以无法创建Derived2类来继承Base类。如果尝试这样做,编译器会报错。

这个示例演示了如何使用overridefinal关键字来指示函数覆盖和阻止进一步的派生类覆盖。

 

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

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

相关文章

【Ubuntu 20.04 / 22.04 LTS】最新 esp-matter SDK 软件编译环境搭建步骤

仓库链接&#xff1a;esp-matter SDK官方软件说明&#xff1a;ESP Matter Programming Guide官方参考文档&#xff1a;使用 Matter-SDK 快速搭建 Matter 环境 (Linux) 环境要求 Ubuntu 20.04 或 Ubuntu22.04网络环境支持访问 Gihub 在安装 esp-matter SDK 软件编译环境之前&a…

基于C++中netCDF库读取.nc数据时的一些坑

本文介绍基于C 语言的netCDF库读取.nc格式的栅格文件时&#xff0c;出现数据无法读取、数据读取错误、无法依据维度提取变量等情况的原因与解决方法。 最近&#xff0c;由于需要读取ERA5气象数据&#xff0c;因此使用C语言中的netCDF库读取.nc格式文件&#xff1b;这其中也是踩…

Docker基础教程 - 7 容器数据卷

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 7 容器数据卷 什么是容器卷&#xff0c;为什么需要容器卷&#xff1f; 我们在运行容器的时候&#xff0c;产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器&#xff0c;数据…

网络性能优化工具

网络优化是 IT 行业的一个重要方面&#xff0c;网络很复杂&#xff0c;管理员努力保持其平稳运行&#xff0c;然而&#xff0c;网络环境也是不可预测和动态的&#xff0c;任何未受监控的问题都可能像滚雪球一样变成中断。 优化网络性能需要引入&#xff1a; 新设备和应用程序…

Axure RP 10:让原型设计更快、更直观、更智能 mac版

Axure RP 10是一款强大的原型设计工具&#xff0c;它能够帮助设计师快速创建高保真、交互式的原型&#xff0c;从而更好地展示和测试设计方案。这款软件凭借其直观易用的界面和丰富的功能&#xff0c;已经成为了许多设计师的首 选工具。 Axure RP 10 for Mac版软件获取 首先&a…

还在使用 RESTful API ? 试一试 GraphQL

前言 GraphQL 和 RESTful API 是两种不同的网络通信接口设计理念&#xff0c;它们都可以用于客户端和服务器之间的数据交换&#xff0c;但是有着不同的工作方式和特点。 各自的特点以及优缺点 GraphQL&#xff1a; 特点&#xff1a; 查询语言: GraphQL 是一个查询语言&…

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前&#xff0c;首先我们需要站在一个全局的视角&#xff0c;来看 SQL 是如何运作执行的。通过这种方式&#xff0c;我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式&#xff0c;有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO&#xff1a;DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而&#xff0c;由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外&#xff0c;在训练的早期阶段匹配的不稳定性会…

利用Cocos游戏开发中的跑马灯祝女神们节日快乐

点击上方亿元程序员+关注和★星标 引言 Cocos游戏开发中的跑马灯广播效果 大家好,今天是国际劳动妇女节,也就是我们如今熟知的女神节。 今天打算通过游戏开发中的跑马灯广播这最直接的方式祝女神们节日快乐! 跑马灯作为游戏中常见的UI元素,通常被用来展示重要的信息或者…

Gafana Redis Overview dashboard

1. 简介 根据提供的 Redis 监控仪表盘 JSON 文件,包含的监控指标及其简要描述如下: redis_uptime_in_seconds: Redis 实例的运行时间(秒)。 redis_connected_clients: 当前连接到 Redis 实例的客户端数量。 redis_memory_used_bytes: Redis 实例使用的内存量(字节)。 redis_m…

Qt + mqtt对接阿里云平台(一)

一、阿里云平台 官网&#xff1a;点击跳转 二、创建产品与设备 1、“公共实例” 2、“设备管理”->“产品”->“创建产品” 3、“产品名称”->“自定义品类”->"确认" 4、“前往添加” 5、“添加设备” 6、摄入DeviceName和备注名称 7、"前往查…

css-vxe-form-item中输入框加自定义按钮(校验位置错误)

1.浮动错误效果 提示内容不对 2.不使用浮动&#xff0c;使用行内块元素 代码如下 <vxe-form-item title"yoyo:" field"assembleWorkNo" span"8"><template #default><vxe-input style"width:70%;display:inline-block;&quo…

Linux之cd、pwd、mkdir 命令

cd命令&#xff0c;切换目录 1&#xff09;当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录。 2&#xff09;我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 3&#xff09;cd命令来自英文&#xff1a;C…

基于FPGA的PSRAM接口设计与实现

一 PSRAM与HyperRAM 1、概述 2、异同 待完善 二 PSRAM分析 1、特性 1、关键点 待完善 三 PSRAM方案设计与验证 待完善 1、整体方案设计 2、验证 仿真工具采用VCSVerdi&#xff0c;PSRAM接口控制IPAPS6408L model进行验证。 四 结论 备注&#xff1a;以AP公司的APS6408L…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

如何恢复未保存的Word文档

Microsoft Word 是世界上最流行的软件之一。它不仅是各行业提高生产力的利器&#xff0c;而且广泛应用于我们的日常生活中。因此&#xff0c;当您发现自己工作了数小时和数天的word doc文档被意外未保存、删除或丢失时&#xff0c;大多数人可能都知道恐慌和绝望。 今天我们将向…

HelpLook VS GitBook:知识库优劣详解

在信息爆炸的时代&#xff0c;企业要保持竞争优势&#xff0c;就必须善于管理和利用内部的知识资产。企业知识库作为一种集中存储和共享知识的工具&#xff0c;正在成为现代企业不可或缺的一部分。 HelpLook和Gitbook是提供专业知识库的两个平台&#xff0c;也被大众熟知。它们…

Spring Boot 配置热部署

前言 对于 Spring Boot 项目之中, 在刚开始学习的时候, 每当代码进行变动的时候, 想要生效那就必须要手动重启. 为什么要重启呢 ? 原因在于写的代码是依靠运行之后的 class 文件运行的, 当我们的代码更新以后, 如果不去手动重启, 那么就无法生成新的 class 文件, 执行的就是旧…