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

Roe*_*rel 6 c++ virtual inheritance c++-cli

情况就是这样.

class Interface
{
public:
    virtual void foo() = 0;
}

class MyClass : Interface
{
public:
    virtual void bar() = 0;
private:
    void foo()
    {
        //Some private work and checks.
        bar();
    };
}
Run Code Online (Sandbox Code Playgroud)

我希望我的用户将创建一个继承自MyClass的类,他们必须在那里实现bar().
但是我怎么能阻止他们不会覆盖foo()呢?因为使用我的重要性对我来说很重要foo().

Bjö*_*lex 13

在C++ 11中,您可以将方法标记为final阻止它被覆盖:

class MyClass : Interface
{
public:
    virtual void bar() = 0;
private:
    void foo() final
    {
        //Some private work and checks.
        bar();
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 阅读[此问题](http://stackoverflow.com/questions/7026462).`sealed`是微软特有的.`final`在C++ 11标准的§7.6.4[dcl.attr.final]中定义. (5认同)

iam*_*ind 6

根据其他答案,您可以final在C++ 11中使用关键字(此类工具类似于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();
    };
}
Run Code Online (Sandbox Code Playgroud)

所以现在你已经删除了它virtual,foo()并且绑定将在编译时发生.请记住,CRTP有自己的限制,因此是否使用它取决于您.