C++11: final 说明符

指定某个虚函数不能在子类中被覆盖,或者某个类不能被子类继承

语法

当应用到成员函数时,标识符 final 在类定义中的成员函数声明或成员函数定义的语法中,紧随声明符之后出现。

当应用到类时,标识符 final 出现在类定义的开头,紧跟类名之后出现。

声明符 虚说明符序列(可选) 纯说明符(可选)(1) 
 
声明符 虚说明符序列(可选) 函数体(2) 
 
类关键词 attr(可选) 类头名 类虚说明符(可选) 基类子句(可选)(3) 
 

1) 在成员函数声明中,final 可在紧跟声明符之后的 虚说明符序列 中出现,而若使用 纯说明符 则在其之前。

2) 在类定义内的成员函数定义中,final 可在紧跟声明符之后并紧接 函数体 之前的 虚说明符序列 中出现。

3) 在类定义中,final 可在紧跟类名之后,紧接 基类子句(若使用它)起头的冒号之前,作为 类虚说明符 出现。

情况 (1,2) 中,若使用 虚说明符序列,则它是 overridefinalfinal override 或 override final 之一。情况 (3) 中,若使用 类虚说明符 则仅允许 final

解释

当在虚函数声明或定义中使用时,final 确保函数为虚并指定其不可被派生类覆盖。若这么做则程序非良构(生成编译时错误)。

当在类定义中使用时,final 指定此类不可在另一类的定义中的 基类说明符列表 中出现(换言之,不能派生于它)。若这么做则程序非良构(生成编译时错误)。final 亦可用于联合体定义,此情况下它没有效果(除了 std::is_final 的输出结果),因为不能从联合体派生。

final 是在成员函数声明或类头部中使用时有特殊含义的标识符。其他语境中它未被保留,而且可用于命名对象或函数。

示例

struct Base
{
    virtual void foo();
};
 
struct A : Base
{
    void foo() final; // Base::foo 被覆盖而 A::foo 是最终覆盖函数
    void bar() final; // 错误:非虚函数不能被覆盖或是 final
};
 
struct B final : A // struct B 为 final
{
    void foo() override; // 错误:foo 不能被覆盖,因为它在 A 中是 final
};
 
struct C : B // 错误:B 为 final
{
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用:在1.h 中#include了 2.h ,然后在2.h 中又#include了 1.h ,然后这个错误就出现了 。 引用:使用 CopyOnWriteArrayList 需要注意的“坑”主要有两个方面。一个是应用场景,CopyOnWriteArrayList 仅适用于写操作非常少的场景,而且能够容忍读写的短暂不一致。例如上面的例子中,写入的新元素并不能立刻被遍历到。另一个需要注意的是,CopyOnWriteArrayList 迭代器是只读的,不支持增删改。因为迭代器遍历的仅仅是一个快照,而对快照进行增删改是没有意义的。 。 引用://final,override出现在形参列表以及尾置返回类型之后 #include using namespace std; struct B{ virtual void f1(int) const; virtual void f2(int); void f3(int) final;//出错,final不能修饰非虚函数 }; ...。 引用中的问题是由于在1.h中包含了2.h,在2.h中又包含了1.h,导致循环包含的错误。为了解决这个问题,你可以使用头文件保护符号来防止循环包含。在1.h和2.h的开头分别加上#ifndef 和 #define 防止重复包含,然后在结尾处加上#endif来关闭头文件保护符号。 引用中的问题是关于使用CopyOnWriteArrayList时需要注意的两个方面。首先,CopyOnWriteArrayList适用于写操作非常少的场景,并且可以容忍读写的短暂不一致。也就是说,当你向CopyOnWriteArrayList中写入新元素时,可能不能立刻被遍历到。其次,CopyOnWriteArrayList的迭代器是只读的,不支持增删改操作。因为迭代器遍历的是一个快照,对快照进行增删改是没有意义的。 引用中的问题是关于final和override的使用位置的错误。在C++中,final和override关键字应该出现在成员函数的声明或定义中,并且要紧跟在函数名之后的括号内。在给定的代码中,final被错误地放在了函数定义的末尾,导致出现错误。要解决这个问题,你需要将final关键字放在函数声明或定义的括号内正确使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值