C++ 最终类和切片习惯用法

标签 c++ final object-slicing

我碰巧正在浏览 mongoDB 的源代码,并发现了这个有趣的构造:

class NonspecificAssertionException final : public AssertionException {
public:
    using AssertionException::AssertionException;

private:
    void defineOnlyInFinalSubclassToPreventSlicing() final {}
};

私有(private)方法如何防止切片?我似乎想不出问题所在。

干杯,乔治

最佳答案

唯一可以应用final说明符的成员函数是虚拟成员函数。很可能在 AssertionException 或其自己的基类之一中,此成员定义为

virtual void defineOnlyInFinalSubclassToPreventSlicing() = 0;

因此,层次结构中的所有类(除了最派生的类)都是抽象基类。人们不能创建抽象类的值(它们只能作为基础)。因此,人们可能不会一不小心写

try {
    foo();
}
catch(AssertionException const e) { // oops catching by value
} 

如果AssertionException不是抽象的,则可以编写以上内容。但是当它是抽象的时,编译器会向异常处理程序提示,迫使我们通过引用捕获。推荐做法是通过引用进行捕获。

将成员(和类)标记为 final 确保不可能进一步派生。因此,当继承层次结构发生更改时,该问题不会意外再次出现。因为添加另一个类并再次将defineOnlyInFinalSubclassToPreventSlicing 定义为final 的程序员会引发编译器错误,因为该成员已在基类中声明为final。因此,他们必须从基类中删除实现,从而使其再次抽象。

这是一个簿记系统。

关于C++ 最终类和切片习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59979907/

相关文章:

c++ - 指向不同派生类的指针数组

c++ - 将字符串 "DDMMYY HH:MM"格式化为 "YY-MM-DD HH:MM"

c++ - 定义 boost 变体类型以传递明确的空值

C++、CMake 和 Xcode 符号导航器

java - JAVA中Synchronized和Final的关系

c++11 - C++0x 中的最终虚函数

python - 选择最后 n 列并排除数据框中的最后 n 列

c++ - 将位图图像加载到 WINApi C++ 中并显示

java - 由于初始化时捕获异常,局部变量无法定义为 Final

c++ - 什么是对象切片?