2012-01-08 51 views
6

情况就是这样。防止继承者类重写基类的虚函数

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()
但我怎么能enfoce他们不会覆盖foo()?因为使用我的foo()对我很重要。

+0

这是否编译?如果是这样,你没有问题,因为你的foo是私人的。编辑:啊,不,它不编译... – 2012-01-08 11:49:44

+2

@MrLister:私有方法仍然可以被重写。 – 2012-01-08 11:51:08

+0

真的,对不起。没关系。答案已经给出。 – 2012-01-08 12:00:52

回答

13

在C++ 11可以标记该方法final以防止它被重写:

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

谢谢,你让我走向正确的方向。但在C++ 11V1.0中,“final”被改为“sealed”。 – 2012-01-08 12:02:02

+5

阅读[这个问题](http://stackoverflow.com/questions/7026462)。 'sealed'是微软特有的。 'final'在C++ 11标准的§7.6.4[dcl.attr.final]中定义。 – 2012-01-08 20:13:53

+0

谢谢!这是我正在寻找的:D – mr5 2014-02-24 06:44:00

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内斯的foo()和结合会发生在编译时。请记住,CRTP有其自身的限制,因此是否使用它取决于您。