C++11之重写说明符override和final

关于

本文代码演示环境: win10 + vs2017

一个困扰

之前MFC用的多了,发现一个问题: 子类窗口的某个函数是否重载了基类的函数。解决办法是: 打开基类的代码,一个个排查。
这只是一个具体化的例子。

override 和 final

c++11引入关键字 overridefinal 用来解决继承中虚函数的问题。

关键字作用
override指明该函数重载的基类中的一个函数
finalA.禁止该函数从基类继承;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关键字,无实际意义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值