如何防止方法在派生类中被覆盖?

sri*_*iks 15 c++ inheritance overriding

如何强制派生类不会覆盖基类方法?

moo*_*eep 27

如果能够使用finalC++ 11中的说明符,则可以阻止派生类重写该方法.(Microsoft编译器似乎支持sealed类似语义的类似.)

这是一个例子:

#include <iostream>

struct base {
    // To derived class' developers: Thou shalt not override this method
    virtual void work() final {
        pre_work();
        do_work();
        post_work();
    }
    virtual void pre_work() {};
    virtual void do_work() = 0;
    virtual void post_work() {};
};

struct derived : public base {
    // this should trigger an error:
    void work() {
        std::cout << "doing derived work\n";
    }
    void do_work() {
        std::cout << "doing something really very important\n";
    }
};

int main() {
    derived d;
    d.work();
    base& b = d;
    b.work();
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试编译时得到的结果:

$ g++ test.cc -std=c++11
test.cc:17:14: error: virtual function ‘virtual void derived::work()’
test.cc:5:22: error: overriding final function ‘virtual void base::work()’
Run Code Online (Sandbox Code Playgroud)

  • 问题:当我不希望在派生类中重写时,为什么我应该将"work()"声明为"virtual" - 为什么不将它标记为final? (3认同)
  • @ Sonic78好问题!在现实世界中的代码,你可能有另一个基类`base`,提供您要防止从中间基派生类被覆盖的虚函数. (2认同)

Gre*_*ill 17

如果使方法非虚拟,则派生类不能覆盖该方法.但是,类不能覆盖基类中的方法,还会阻止进一步派生类重写相同的方法.一旦该方法是虚拟的,它就会保持虚拟.

  • 使用C++ 11,您可以使用<code> final </ code>说明符来避免在派生类中重写方法 (5认同)