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 ...
随机推荐
- snpEff注释结果各区域统计之和大于变异总数?
目录 问题一:各区域注释之和大于变异总数? 问题二:注释Region出现Gene和transcript等区域? 问题一:各区域注释之和大于变异总数? snpEff的结果很简单,但常常遇到如下问题. 我 ...
- Linux之crond定时任务
1. 使用crontab工具配置的定时任务 2. 配置定时任务建议规范 3. 定时任务配置问题导致系统出现故障实例 1. 使用crontab工具配置的定时任务 名称 crontab - 维护单个用户的 ...
- Scrapy-Splash的安装和使用
Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Docker,安装之后,会启动一 ...
- Spring Cloud中五花八门的分布式组件我到底该怎么学
分布式架构的演进 在软件行业,一个应用服务随着功能越来越复杂,用户量越来越大,尤其是互联网行业流量爆发式的增长,导致我们需要不断的重构应用的结构来支撑庞大的用户量,最终从一个简单的系统主键演变成了一个 ...
- C#最大值
dtToSList = sqlAccess.ExecuteTable(CommandText); ToSNo = Convert.ToString(dtToSList.Rows[i].ItemArra ...
- Go Robot
1 <html> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...
- ubuntu基础
下载地址: http://cdimage.ubuntu.com/releases/ #:配置多网卡静态IP地址和路由 root@ubuntu:~# vim /etc/netplan/01-netcfg ...
- 【Linux】【Services】【Docker】应用
1. Docker应用: 镜像:包含了启动Docker容器所需要的文件系统层级及其内容:基于UnionFS采用分层结构实现: bootfs,rootfs registry:保存docker镜像及镜像层 ...
- AOP切入点的配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- 【手帐】Bullet Journal教程
最近觉得自己的日程记录本有待提高,于是从今年开始开始入坑了手帐. *内容源自Bullet Journal官网.https://bulletjournal.com/pages/learn 快速笔记 Bu ...