如何强制基类方法不被派生类覆盖?
final
关键字,则可以防止派生类覆盖该方法。(微软编译器似乎支持具有相似语义的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();
}
当我尝试编译它时,这是我得到的结果:
$ 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()’
base
,它提供了一个虚函数,你希望防止派生自你的中间基类的类对其进行覆盖。 - moooeeeep如果您将方法设置为非虚拟的,则派生类无法重写该方法。但是,在 C++03 中,一个类不能覆盖基类中的方法,并且还阻止进一步的派生类重写相同的方法。一旦方法被设置为虚拟的,它就会保持虚拟。
不要将它设为虚拟的。
这并不能防止从您的类派生并隐藏函数(通过提供另一个具有相同名称的成员函数)。但是,如果您的类本来就不打算派生(没有虚析构函数,也没有虚成员函数),那么这不应该成为问题。
如果你想要保持它为公共的,那就别声明它为虚函数。
编辑:Srikanth 评论说想知道在派生类中重写一个私有成员函数的情况。
class A
{
public:
virtual ~A(){};
void test()
{
foo();
};
private:
virtual void foo()
{
std::cout << "A";
};
};
class B : public A
{
public:
virtual void foo()
{
std::cout << "B";
};
};
void test()
{
B b;
A& a = b;
a.test(); // this calls the derived B::foo()
return 0;
}`
据我所知,C++无法实现这一点,您可以尝试将其声明为私有。在此链接http://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm上查找更多信息。
final
方法是否具有直接等效物,则没有。 - Steve Jessopfinal
限定符:https://dev59.com/cm855IYBdhLWcg3wNxkM#16896559 - moooeeeep