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)
Gre*_*ill 17
如果使方法非虚拟,则派生类不能覆盖该方法.但是,类不能覆盖基类中的方法,还会阻止进一步派生类重写相同的方法.一旦该方法是虚拟的,它就会保持虚拟.