防止继承者类覆盖基类的虚函数

时间:2012-01-08 11:45:14

标签: c++ inheritance c++-cli virtual

情况是这样的。

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()对我很重要。

2 个答案:

答案 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有自己的限制,因此是否使用它取决于您。