我有时候读过(可能在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