【发布时间】:2010-08-31 15:03:18
【问题描述】:
我正在扩展由第三方库提供的类。这个类,我们称之为Foo,有一个reset() 方法,可以调用它来重新启动Foo 的行为。 reset() 方法也在类内部使用。
class Foo
{
public:
void reset () {
/* ... */
}
void something () {
reset();
}
};
到目前为止,我还需要重载 reset() 方法以重置我的附加功能:
class Bar : public Foo
{
public:
void reset() {
/* ...something... */
Foo::reset();
}
};
不幸的是,由于Foo::reset() 方法不是虚拟的,通过调用Bar::something() 我得到的是Foo::reset() 方法而不是Bar::reset()。
有没有办法(也不同于重载Foo::something())使其向后虚拟化?
【问题讨论】:
-
顺便说一句,通过这种方式,我学会了始终将任何公开和内部使用的方法设置为虚拟。
-
这是一个糟糕的决定,谷歌搜索 NVI,你会看到避免公共虚拟方法的趋势。你面临的问题是不同的:你不能扩展一个不是为扩展而设计的类。
-
我强烈支持非虚拟接口。使用
virtual公共方法类似于将句柄返回到您的内部 -> 这是一个不可以。 -
在 Bar 中,您既不会重载(Bar 和 Foo 的
reset具有相同的签名)也不会覆盖它(因为 Foo 的reset不是虚拟的);你隐藏了 Foo 的reset()。