什么是C ++' final'关于类设计的方法注释承诺?

时间:2014-08-22 09:08:47

标签: c++ oop c++11

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

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

任何来自Locked的类都不能再覆盖method

但从OOP的角度来看,它对API,合同有什么看法呢?正如已经要求Java作为Locked的班级作者,关于现在整个班级的设计,我必须要注意什么,我有什么承诺?< / p>

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

2 个答案:

答案 0 :(得分:5)

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

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

关键字本身只限制函数被覆盖它不会神奇地知道它对于函数不会随着扩展基类而改变的意义。

#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”

答案 1 :(得分:0)

从OO理论的角度来看(参见LSP)派生类中的重写方法不得违反基类中该方法集的任何约定。也就是说,从用户的角度来看,理想情况是该方法是否被覆盖在任何地方都没有区别。因此,它就像是编译器的优化机会,或者是可能希望进一步子类化的程序员的提示。