8

我使用库中的 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 中是否有一些东西会引发编译器错误?

4

3 回答 3

7

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

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

于 2011-08-24T14:47:10.260 回答
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 { ... }

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

于 2011-08-24T14:50:00.710 回答
4

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

1.正确的术语是override,而不是overwrite

于 2011-08-24T14:46:34.737 回答