C++11之重写说明符override和final
2024-09-04 18:36:57
关于
本文代码演示环境: 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关键字,无实际意义。
最新文章
- 异步编程系列第05章 Await究竟做了什么?
- 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
- vsftp 根据用户设置
- C语言。自定义函数简单版
- ScannerTest-------double string
- CodeForces 567A Gerald is into Art
- git推送本地分支到远端 以及删除远端分支的 命令
- Python核心编程 练习
- .Net 缓存依赖详解
- WINDOWS硬件通知应用程序的常方法(五种方式:异步过程调用APC,事件方式VxD,消息方式,异步I/O方式,事件方式WDM)
- 怎么 得到 DBGrid选中行的数据
- alpha-咸鱼冲刺day1
- HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)
- 嵌套调用less函数时参数值的变化及提取部分-遁地龙卷风
- 不允许lseek文件 | nonseekable_open()【转】
- C++程序设计方法3:派生类对象的构造和析构过程
- English trip V2 - A 1. Fastival Teacher:Julia Key:
- jsp弹窗并跳转
- poj 1789 prime
- linux IP 命令使用举例(转)