我使用库中的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中是否存在抛出编译器错误的内容?
答案 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。正确的术语是覆盖,而不是覆盖。