C++"最终"方法注释对类设计的承诺是什么?

tow*_*owi 5 c++ oop c++11

我知道finalC++中的方法注释(从C++ 11开始)从语言的角度来看是什么.

class Base {
    virtual void method();
};
class Locked : public Base {
    virtual void method() final;
};
Run Code Online (Sandbox Code Playgroud)

任何派生的类Locked都不能再覆盖method了.

但从OOP的角度来看,它对API,合同有什么看法呢?正如已经要求Java一样,作为班级作者,我现在必须了解Locked整个班级的设计,我有什么承诺?

例如:我可以想象通过注释final我说"这种方法行为不会改变".但是如果我在里面调用其他方法method()呢?如果他们可以被覆盖,我怎么能保证呢?那么,用最终方法进行注释,从严格来说,从OOP的角度来看,我不能在该方法中使用其他可覆盖的方法吗?还是其他设计限制?

cer*_*wny 5

通常,您应该使用final关键字为用户提供确定性,即出于安全原因或者您希望将类函数限制为final的任何其他要求,不会出现此函数的覆盖行为.

如果您正在使用任何其他方法,那么它们也应该被标记为final,除非例如它们运行的​​字段是私有的(您可以想象一些默认行为修改私有字段的情况,但您可以允许覆盖函数执行其他操作好).

关键字本身只限制函数被覆盖它不会神奇地知道它对于函数不改变扩展base的类是什么意思.

#include <iostream>
using namespace std;

class foo{
    public:
    virtual int bar() final{
        foobar();
    }

    virtual void foobar(){cout << "blah";}
};

class baz : public foo{
    public:
        void foobar() override {
            cout << " not blah";
        }
};

int main(){
    baz * a = new baz();
    a->bar();
}
Run Code Online (Sandbox Code Playgroud)

例如,此代码将打印"not Blah"