我想要做的是有點模糊,所以讓我給上一個例子(這不是實際的代碼):類型轉換方法指針以父類的方法
template <class T>
class ArrayStorage {
protected:
void processStuff(void (ArrayStorage<T>::*procedure)(T *)) {
for (int i = 0; i < count; i++)
(this->*procedure)(content[i]);
}
// No method of type void (ArrayStorage<T>::*)(T *)
private:
T **content;
int count;
};
class DrawableStorage : public ArrayStorage<Drawable> {
public:
void drawStuff() {
processStuff((void (ArrayStorage<Drawable>::*)(Drawable *)) &DrawableStorage::drawOne);
}
private:
void drawOne(Drawable *item) {
item->draw();
}
};
基本上,有一個通用的容器,它能夠迭代它的項目並在每個項目上使用一個方法(其指針在參數中)。然而,這個方法並不存在於這個類中,而只存在於它的子類中。你可以看到,在子類「drawStuff」方法中,我提供了一個子類的方法指針,但是作爲基類的一個方法進行了類型化。
令人驚訝的是,這已經成功地編譯和工作得很好。
我的問題是,它只是一個巧合,我特別的編譯器能夠處理它,而實際上它是完全無效的,我應該擺脫它,或者是方法指針的正確使用?
謝謝。
是的,我想到了,但我想知道我的版本是否也有可能。 – Detheroc 2012-02-04 16:33:58
@Dheheroc:不像你寫的那樣。如果你在基類中有一個虛擬接口,那麼也許,但是爲什麼這種方法是完全可用的呢?整個函數調用可能會被內聯,並且不會導致任何實際的代碼。 – 2012-02-04 16:36:34