C ++禁止覆盖虚函数

时间:2011-08-24 14:42:53

标签: c++ boost boost-mpl

我使用库中的A类,并希望通过自己的类B添加一些功能。 B类的用户应该从它派生出来,好像他将从A类派生出来。

class A {
    public:
        virtual void func1()=0;
        virtual void func2()=0;
        ...
}
class B: public A {
    public:
        virtual void func1() {...}
}

因此,如果某人创建了一个源自B的C类,他应该实现func2:

class C: public B {
    public:
        virtual void func2() {...}
}

对我的应用程序来说非常重要的是,C类不会覆盖func1,从而消除了B :: func1()。

有没有办法禁止为B的所有子类重写此虚函数?如果不是在普通的C ++中,当覆盖此函数时,boost MPL中是否存在抛出编译器错误的内容?

3 个答案:

答案 0 :(得分:7)

不在C ++ 03中,但是C ++ 0x提供了特殊的“最终”标识符来禁止它:

http://en.wikipedia.org/wiki/C++0x#Explicit_overrides_and_final

答案 1 :(得分:7)

不,这在当前版本的C ++(即C ++ 03)中是不可能的。即将推出的C ++ 11标准将包含上下文关键字final,这将使这成为可能:

// C++11 only: indicates that the function cannot be overridden in a subclass
virtual void MemberFunction() final { ... }

Microsoft Visual C ++编译器还包含关键字sealed作为扩展,其功能类似于C ++ 11关键字final,但这仅适用于Microsoft的编译器。

答案 2 :(得分:4)

没有。在C ++ 03中,您无法阻止派生类覆盖基类的 1 虚函数。但是,基类可以强制派生(非抽象)类为虚函数提供实现(在这种情况下,虚函数实际上是虚函数)。

1。正确的术语是覆盖,而不是覆盖