我正在扩展第三方库提供的类。我们称之为Foo
的班级有一个reset()
方法,可以调用该方法以重新启动Foo
的行为。该类还内部使用reset()
方法。强制执行第三方方法virtuality
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()
不同),使它向后虚拟?
顺便说一句,通过这种方式,我学会了永远将任何既公开又内部使用的方法设置为虚拟。 – Dacav 2010-08-31 15:08:19
这是一个糟糕的决定,谷歌NVI,你会看到避免公共虚拟方法的趋势。你遇到的问题是不同的:你不能扩展一个没有被设计为扩展的类。 – 2010-08-31 15:10:17
我强烈支持非虚拟接口。使用'virtual'公共方法类似于返回内部处理句柄 - >这是一个No-No。 – 2010-08-31 15:18:08