我正在擴展第三方庫提供的類。我們稱之爲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