C++11之重写说明符override和final
关于
本文代码演示环境: win10 + vs2017
一个困扰
之前MFC用的多了,发现一个问题: 子类窗口的某个函数是否重载了基类的函数。解决办法是: 打开基类的代码,一个个排查。
这只是一个具体化的例子。
override 和 final
c++11引入关键字 override和final 用来解决继承中虚函数的问题。
| 关键字 | 作用 |
|---|---|
| override | 指明该函数是重载的基类中的一个函数 |
| final | A.禁止该函数从基类继承;B.禁止该函数的重载 |
用法
注意: 这俩关键字 必须作用于虚函数。否则,编译提示将出错。
错误示范
代码
class case_err
{
public:
// 错误,编译器提示: error C3668: “case_err::name()”: 包含重写说明符“override”的方法没有重写任何基类方法
void name() override {}
// error C3609: “demo_class::gender”: “final”函数必须是虚函数
void gender() final {}
};
正确用法
基类
class base_class
{
public:
// 用作测试 override 关键字的函数
virtual void show() { std::cout << "base_class::show()\n"; }
// 用作测试 final 关键字的函数
virtual void say() final { std::cout << "base_class::say()\n"; }
};
派生类
class demo_class : public base_class
{
public:
// override的作用:指明该函数时重载的基类中的一个函数
// 这里明确指明该函数是继承基类的show函数
virtual void show() override { std::cout << "demo_class::show()\n"; }
// 编译错误: error C3248: “base_class::say”: 声明为“final”的函数无法被“demo_class::say”重写
// virtual void say() override { std::cout << "demo_class::say()\n"; }
};
纯虚函数
纯虚函数一种特殊的虚函数。 but,纯虚函数通常用作基类定义接口。 显然,纯虚函数不能使用关键字override. 那 final 关键字呢? 一个例子:
class base_class
{
public:
virtual void run() final = 0;
};
理论分析: 纯虚函数 run 使用关键字 final后,run函数不能被派生类(子类)继承并实现,且语法也正确。 实际: 编译通过。
but,类base_class及继承自base_class的类均无法创建对象。因为: base_class的run函数是一个纯虚函数且无法被派生类继承。
结论: 纯虚函数使用final关键字,无实际意义。
C++11之重写说明符override和final的更多相关文章
- C++11学习笔记(5) —— override and final (转)
原文转自 http://blog.csdn.net/fire_lord/article/details/8540592 1.简介 C++为我们提供了继承和虚函数的重写特性. 在派生类中,重写虚函数不强 ...
- C++11 override和final
30多年来,C++一直没有继承控制关键字.最起码这是不容易的,禁止一个类的进一步衍生是可能的但也很棘手.为避免用户在派生类中重载一个虚函数,你不得不向后考虑. C++ 11添加了两个继承控制关键字:o ...
- [转][C++ 11]override and final - write clean and maintainable C++ code
原文: http://arne-mertz.de/2015/12/modern-c-features-override-and-final/ Today I write about a pair of ...
- C++11 override 和 final 关键字
C++11之前,一直没有继承控制关键字.禁用一个类的进一步衍生是可能的但也很棘手.为避免用户在派生类中重载一个虚函数,你不得不向后考虑. C++ 11添加了两个继承控制关键字:override和fin ...
- java 中重载(Overload)和重写(Override)的区别
首先重载和重写是应用于两个不同场景下面的两种不同的手段: 两者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不 ...
- 0605-类的继承、重写、parent、final
定义一个子类(man) //定义一个类 class renlei{ var $name = '王五'; var $age = ''; var $sex = ''; var $todo = ''; fu ...
- 大厂面试题系列:重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分
面试题:重载(Overload)和重写(Override)的区别.重载的方法能否根据返回类型进行区分 面试官考察点猜想 这道题纯粹只是考查基础理论知识,对实际开发工作中没有太多的指导意义,毕竟编辑器都 ...
- Cannot override the final method from SherlockFragmentActivity
调用ActionBarSherlock后页面找不到onCreateOptionsMenu报错 com.actionbarsherlock.app.SherlockFragmentActivity.on ...
- 转:C++的重载(overload)与重写(override)
C++ override overload 的区别 override是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数.在C++中,经常发生在类的继承中.当基类中的某个方法是virtual ...
随机推荐
- Docker Swarm的命令
初始化swarm manager并制定网卡地址docker swarm init --advertise-addr 192.168.10.117 强制删除集群docker swarm leave -- ...
- 07 MySQL安装图解--Windows版本
MySQL安装图解 使用微信扫码关注微信公众号,并回复:"MySQL环境",免费获取下载链接! 1.安装MySQL 2.校验MySQL 3.登录MySQL 登录MySQL:mysq ...
- 学习Java的第三天
一.今日收获 1.今天家里有白事,忙了一整天,也没有看更多的资料 二.今日问题 无 三.明日目标 补全今天耽误的功课,继续学习java!
- add more
# -*- coding: utf-8 -*- print('123', 123) print(type('123'), type(123)) # string, integer /ˈintidʒə/ ...
- 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)
0.前言 0.1 分布式运算框架的核心思想(此处以MR运行在yarn上为例) 提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...
- C++11的auto自动推导类型
auto是C++11的类型推导关键字,很强大 例程看一下它的用法 #include<vector> #include<algorithm> #include<functi ...
- Type difference of character literals in C and C++
Every literal (constant) in C/C++ will have a type information associated with it. In both C and C++ ...
- 多线程异步操作导致异步线程获取不到主线程的request信息
org.springframework.web.context.request.RequestContextHolderorg.springframework.web.context.request. ...
- Dubbo消费者异步调用Future使用
Dubbo的四大组件工作原理图,其中消费者调用提供者采用的是同步调用方式.消费者对于提供者的调用,也可以采用异步方式进行调用.异步调用一般应用于提供者提供的是耗时性IO服务 一.Future异步执行原 ...
- 【Linux】【Commands】文件管理工具
文件管理工具:cp, mv, rm cp命令:copy 源文件:目标文件 单源复制:cp [OPTION]... [-T] SOURCE DEST 多源复制:cp [OPTION]... SOURCE ...