前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++:38---final关键字和禁止类继承

C++:38---final关键字和禁止类继承

作者头像
用户3479834
发布2021-02-03 14:50:54
2.1K0
发布2021-02-03 14:50:54
举报
文章被收录于专栏:游戏开发司机游戏开发司机

一、final关键字

  • C++新标准规定:如果我们定义的类不希望被其他类继承,那么可以在类名后加一个final关键字
  • 但是final类仍然可以继承其他类。
  • 实际上C++11的关键字final有两个用途。第一,它阻止了从类继承;第二,阻止一个虚函数的重载。

二、演示案例

代码语言:javascript
复制
代码语言:javascript
复制
class A final{};
class B:public A{}; //报错,A是final的
class A {};
class B final :public A{}; //正确
class C:public B {}; //错误
代码语言:javascript
复制

某些实现系统服务、基础功能和加密等的类通常是不允许有子类的;实现者不想客户端从这些类派生新类而修改他们。标准库容器,如std:: vector和std:: list的无子类化类型就是另一个很好的例子。这些容器没有虚拟析构函数或者确切地说没有任何虚成员函数。

然而,程序员常常在没有意识到风险的情况下坚持从std::vector派生。在C++11中,无子类类型将被声明为如下所示:

代码语言:javascript
复制
class TaskManager {/*..*/} final;
class PrioritizedTaskManager: public TaskManager {
};  //compilation error: base class TaskManager is final

同样,你可以通过声明它为final来禁止一个虚函数被进一步重载。如果一个派生类试图重载一个final函数,编译器就会报错:

代码语言:javascript
复制
struct A
{
virtual void func() const;
};
struct B: A
{
void func() const override final; //OK
};
struct C: B
{
void func()const; //error, B::func is final
};

C::func()是否声明为override没关系,一旦一个虚函数被声明为final,派生类不能再重载它。

语法和术语

迄今为止,我已经避免了两个有关override和final的次要问题。第一个是它们独特的位置。与virtual、inline、explicit extern以及一些类似的函数说明符不同的是,这两个关键字放在函数参数列表右括号之后,或者(对于无子类的类来说)一个类声明的右大括号之后。

这些关键字的特殊位置是由另一个不同寻常的性质决定的:override和final不是普通关键字。事实上官方地说,它们根本不是关键字。C++11把它们作为只是为了在特定上下文和位置下获取特殊意义的标示符。在任何其他位置或上下文,它们都被当成普通用用户标示符(ps:自己改的,不知对不)。因此,一个完全有效的C++11代码如下:

代码语言:javascript
复制
//valid C++11 code
int final=0;
bool override=false;
if (override==true){
cout<<”override is: “<<override<<endl;}
struct D{} final;
struct A
{virtual bool func(); };
struct B:A
{ bool func() override final; };

这似乎有点不可思议,final和override酷似PL/ 1的上下文敏感关键词(CSK)。自1972年以来,C和后来的C+ +一直都很抵触CSK坚持保留关键字的做法。

那为什么委员会将final另外处理呢?选择CSK只是一种妥协方案。将final作为保留关键字可能对现有C++代码造成破坏。如果委员会已经引入了新的保留关键字,他们可能会选择像final_declor_Override这样时髦的,且不太可能与传统C++代码中用户声明的标示符相冲突的字符串等。然而,没有谁喜欢这么丑的关键字(比如,问问C使用者对C99的s_Bool的看法)。这是为什么最终采用CSK方法的原因。

final在C++11中作为关键字,但只在特定的上下文使用。不然它们只被当成普通标示符。虽然委员会不愿称override和final为“上下文敏感关键字”(事实上它们就是),作为替代,它们被官方地称为“具有特殊意义的标示符”。的确很特别

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、final关键字
  • 二、演示案例
    • 语法和术语
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档