Jef*_*den 23
C++ 11添加了一个finalcontextual关键字来支持这个:
class B
{
public:
virtual void foo() final;
};
class D : B
{
public:
virtual void foo(); // error: declaration of 'foo' overrides a 'final' function
};
Run Code Online (Sandbox Code Playgroud)
finalGCC 4.7和Clang 3.0支持.正如Sergius在他的回答中指出的那样sealed,自MSVC++ 2005以来,MSVC++支持它(拼写).因此,如果您封装在一个迷你宏中并根据您的编译器进行设置,那么您可以使用它.只要确保你实际上至少每隔一段时间都使用这样的编译器,这样你就可以及早发现任何错误.
它实际上是默认行为.即如果你没有明确地声明你的类实例方法virtual,它们不能在子类中被覆盖(只有隐藏,这是一个不同的 - 几乎总是错误的 - 情况).
有效的C++第三版,第36项详细论述了这一点.考虑
class B {
public:
virtual void vf();
void mf();
virtual void mf(int);
...
};
class D: public B {
public:
virtual void vf(); // overrides B::vf
void mf(); // hides B::mf; see Item33
...
};
D x; // x is an object of type D
B *pB = &x; // get pointer to x
D *pD = &x; // get pointer to x
pD->vf(); // calls D::mf, as expected
pB->vf(); // calls D::mf, as expected
pD->mf(); // calls D::mf, as expected
pB->mf(); // calls B::mf - surprise!
pD->mf(1); // error - D::mf() hides B::mf(int)!
pB->mf(1); // calls B::mf(int)
Run Code Online (Sandbox Code Playgroud)
所以这并不完全是finalJava中的行为,但是你只能用C++来实现这一点.另一种方法可能是完全阻止子类化.技术 - 工作,但不是很好 - 解决方案是声明所有构造函数private(并提供静态工厂方法,如果你想允许实例化你的类,当然).
| 归档时间: |
|
| 查看次数: |
8532 次 |
| 最近记录: |