【问题标题】:Prevent inheritor class from overriding virtual function of base class [duplicate]防止继承类覆盖基类的虚函数[重复]
【发布时间】:2012-02-05 07:49:49
【问题描述】:

情况是这样的。

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

【问题讨论】:

  • 这可以编译吗?如果是这样,您就没有问题,因为您的 foo 是私有的。编辑:啊,不,它不编译...
  • @MrLister:私有方法仍然可以被覆盖。
  • 真的,对不起。没关系。答案已经给出。

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


【解决方案1】:

根据其他答案,您可以在 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();
    };
}

所以现在你已经删除了foo()virtualness,绑定将在编译时发生。请记住,CRTP 有其自身的局限性,因此是否使用它取决于您。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,你把我引向了正确的方向。但在 C++11V1.0 中,final 改为 sealed
    • 阅读this questionsealed 是特定于微软的。 final 在 C++11 标准的 §7.6.4 [dcl.attr.final] 中定义。
    • 谢谢!这就是我要找的:D
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 2015-07-09
    • 2021-10-22
    • 2012-11-25
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多