我有時候讀過(可能在c.l.C++。moderated)虛擬函數調用可以模板化。我嘗試了以下幾行。虛擬呼叫使用純虛擬成員的地址。它合法嗎?
#include <iostream>
template<class T, class FUN>
void callVirtual(T& t, FUN f){
(*t.*f)();
}
struct Base{
virtual ~Base(){}
virtual void sayHi()=0;
};
struct Derived : public Base{
void sayHi(){
std::cout << "Hi!" << std::endl;
}
};
void Test(){
Base* ptr = new Derived;
callVirtual(ptr,&Base::sayHi);
}
int main()
{
Test();
return 0;
}
Output:
Hi!
模板化方法雖然在編譯時給出了純虛擬基本成員方法的地址,但在運行時調用了正確的方法。 在標準C++中使用純虛擬成員的地址是否合法?
在此先感謝
編輯-1:我刪除了問題的第二部分「它是如何工作的?」。看起來這就是引人注目的。
EDIT-2:我搜索了c.l.C++。moderated,碰到了這個link(http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/5ddde8cf1ae59a0d)。共識似乎是因爲標準不限制它,它是vaild。
編輯-3:在閱讀codeproject文章(感謝ovanes)之後,我在想編譯器會有一些神奇的功能。由於虛函數是通過vtable(編譯器特定的)實現的,因此獲取虛函數的地址總是會在vtable中給出偏移量。根據所使用的'this'指針,調用相應的函數(其地址在偏移量處)。我不知道該如何去證明這一點,因爲標準沒有說出任何東西!
感謝。你知道C++標準的一部分,它提到了指向純虛擬的成員函數指針。我試圖找到,但無法找到任何具體的細節。在我看來,由於允許指向不完整類型的成員指針,因此也允許指向純虛擬的成員指針。 – Abhay 2009-06-09 07:35:43
我錯讀了這個問題。我會更新我的答案。 – 2009-06-09 21:43:44
+1您編輯的答案接近這個問題的答案:-)。我開始認爲考慮虛擬函數(純粹與否)的地址並調用它更接近於實現定義的語言方面。 – Abhay 2009-06-10 06:01:58