情况是这样的。
class Interface
{
public:
virtual void foo() = 0;
}
class MyClass : Interface
{
public:
virtual void bar() = 0;
private:
void foo()
{
//Some private work and checks.
bar();
};
}
我希望我的用户创建一个继承自MyClass的类,他们必须在那里实现bar()
。
但是我怎么能阻止他们不会覆盖foo()
?因为使用我的foo()
对我很重要。
答案 0 :(得分:13)
在C ++ 11中,您可以将方法标记为final
以防止它被覆盖:
class MyClass : Interface
{
public:
virtual void bar() = 0;
private:
void foo() final
{
//Some private work and checks.
bar();
};
}
答案 1 :(得分:6)
根据其他答案,您可以在C ++ 11中使用final
关键字(此类工具类似于Java的final
关键字)。
对于C ++ 03代码,您可以使用CRTP机制(如果您可以更改Interface
的定义,则提供)
template<typename Derived>
class Interface
{
public:
void foo() // not 'virtual'
{
static_cast<Derived*>(this)->foo();
}
}
class MyClass : public Interface<MyClass>
{
public:
virtual void bar() = 0;
private:
void foo()
{
//Some private work and checks.
bar();
};
}
现在你已经删除了virtual
的{{1}},绑定将在编译时发生。请记住,CRTP有自己的限制,因此是否使用它取决于您。