使用最终类说明符时,最终函数说明符是否冗余?
Is the final function specifier redundant when using the final class specifier?
当类已经final
时,是否有任何理由将函数指定为final
?还是多余的?
class B
{
public:
virtual void f();
};
class D final : public B
{
public:
virtual void f() final; // Redundant final?
};
说:从使整个类final
开始,只有在需要从类派生和/或覆盖特定函数时才切换到使单个函数final
,这是一个很好的经验法则吗?
这绝对是多余的,因为将整个类标记为final
使得无法从该类派生,因此无法覆盖任何内容。
9 类 [类]
- 如果一个类被标记为类virt-specifier final,并且它在基子句中显示为基类型说明符 (第10条),程序格式不正确。
因此,编译器甚至不会费心检查从类派生final
类是否真的试图覆盖任何东西。
不,它不是多余的,因为final
应用于类和方法时意味着不同的东西。
-
当
final
应用于一个类时,这意味着该类可能不会出现在另一个类的基本说明符列表中(即你不能从它继承) -
当
final
应用于成员函数时,这意味着该函数在祖先类中必须是虚拟的,并进一步指定它不能在后代类中被重写。
关键的区别在于,成员函数final
说你必须重写祖先类中的虚拟方法 - 否则,编译器会抛出错误。 当应用于成员函数时,final
基本上是override
关键字的扩展。
将final
应用于方法对于捕获细微的 bug 非常有帮助,如果只在类上指定final
,则不会捕获这些错误。
示例 1:如果函数名称拼写错误,或者没有完美地重现参数列表,则该函数实际上不会覆盖基函数,并且在您认为要调用它时不会调用该函数。 但是,如果您指定该函数final
(或override
),编译器将检测到您没有成功覆盖基函数,并会抛出错误。 如果您只指定了类是final
,编译器不会关心您的函数实际上没有覆盖虚函数,也不会抛出错误。
示例 2:如果您指定final
成员函数并且基类中的函数签名发生更改(例如,有人在您测试和签入代码后对基类进行了更改),编译器将帮助指出基函数不再被您的函数覆盖。
- 在提升multi_index容器中,是否定义了"default index"?
- 在类外部初始化的 constexpr 静态成员的声明中是否需要 constexpr 说明符
- 是否可以要求虚函数使用C++"覆盖"说明符?
- 是否可以在C++中测试属性说明符?
- 创建模板函数的每个实例时,模板函数类型定义说明符是否会正确内联?
- Visual Studio 是否正式支持 __int64 的 "%lld" 格式说明符?
- 使用最终类说明符时,最终函数说明符是否冗余?
- 类定义中的宏相关访问说明符是否会导致未定义的行为
- 是否可以指定一个变量作为静态分配的整数数组的大小说明符
- C++标准库是否有用于 printf 转换说明符的模板化 getter
- 访问说明符对好友函数是否重要
- 我们是否应该为析构函数提供无抛掷说明符
- 在越界成员定义的类型说明符中是否可以省略typename
- GCC要求此引用声明使用constexpr说明符是否正确
- 使用 "auto" 的声明是否与使用具体类型说明符的外部声明匹配?
- 函数参数是否允许静态说明符
- 对齐说明符是否适用于"新"?
- C++11是否添加了C99限制说明符?如果没有,为什么不呢
- 是否可以将“auto”关键字用作 C++11 中的存储类说明符
- 是否有一个自动的noexcept说明符