如何强制派生类不会覆盖基类方法?
答案 0 :(得分:24)
如果能够使用C ++ 11中的final
说明符,则可以阻止派生类覆盖该方法。 (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();
}
这是我尝试编译时得到的结果:
$ 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()’
答案 1 :(得分:16)
如果使方法为非虚拟,则派生类不能覆盖该方法。但是,类不能覆盖基类中的方法,并且阻止进一步派生类不能覆盖相同的方法。一旦该方法是虚拟的,它就会保持虚拟。
答案 2 :(得分:2)
不要虚拟。
这不会阻止从您的类派生并隐藏该函数(通过提供具有相同名称的另一个成员函数)。但是,如果你的类无论如何都不是派生的(没有虚拟析构函数,没有虚拟成员函数),那应该不是问题。
答案 3 :(得分:1)
如果你想保持公开,不要将其声明为虚拟。
编辑: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;
}`
答案 4 :(得分:0)
据我所知,你不能在c ++上做到这一点,你可以尝试将其声明为私有。 。在此链接http://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm
上查找更多信息答案 5 :(得分:-1)
简短的回答:没有必要。答案很长,你可以做some twists,但值得吗?