C++禁止覆盖虚函数

Hei*_*nzi 8 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() {...}
}
Run Code Online (Sandbox Code Playgroud)

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

class C: public B {
    public:
        virtual void func2() {...}
}
Run Code Online (Sandbox Code Playgroud)

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

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

SSJ*_*_GZ 7

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

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


Ada*_*eld 7

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

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

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

  • 它不是真正的关键字,而是一个上下文关键字,对吗?也就是说,我仍然可以使用`final`作为标识符? (2认同)