我知道从语言的角度来看,C++(自C++ 11起)中的final方法注释是做什么的。

class Base {
    virtual void method();
};
class Locked : public Base {
    virtual void method() final;
};

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

但是从OOP的角度来看,它对API(契约(Contract))有什么看法呢?正如已经问过Java一样,作为Locked的类(class)作者,我现在必须了解关于整个类的设计,我有什么 promise ?

例如:我可以想象通过用final注释,我是说“此方法的行为不会改变”。但是,如果我在method()中调用其他方法怎么办?如果可以覆盖它们,我该如何保证呢?因此,严格意义上讲,从OOP的角度来看,我是否一定不能在 final方法中进行注释?还是其他设计约束?

最佳答案

通常,您应该使用final关键字为用户确定,出于安全原因或使您希望将class函数限制为final的任何其他要求,此函数不会发生覆盖行为。

如果您使用任何其他方法,它们也应标记为final,除非它们所操作的字段是私有(private)的(您可以想象某些情况下默认行为会修改私有(private)字段,但您可以允许覆盖的函数执行其他操作,例如出色地)。

关键字本身仅限制该函数被覆盖,因为它不会神奇地知道该函数不随扩展基类的变化而改变的真正含义。

#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();
}

例如,此代码将显示“not Blah”

关于c++ - C++ 'final'方法注释对类设计有何 promise ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25443381/

10-10 18:25
查看更多