c++禁止覆盖虚函数

C++ forbid overwriting a virtual function

本文关键字:函数 覆盖 禁止 c++      更新时间:2023-10-16

我使用库中的类a,并希望通过自己的类B向其添加一些功能。类B的使用者应该像从类a中派生出来一样从类B中派生出来。

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抛出编译器错误,当这个函数被覆盖?

不,这在当前版本的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的编译器

在c++ 03中没有,但c++ 0x提供了特殊的"final"标识符来禁止这种情况:

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

No。在c++ 03中,不能阻止派生类重写基类的1虚函数。然而,基类可以强制派生类(非抽象类)提供虚函数的实现(在这种情况下,虚函数实际上是虚函数)。

<一口> 1。正确的术语是override,而不是overwrite