【发布时间】:2009-06-09 06:48:06
【问题描述】:
我曾经读过(可能在 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++ 中获取纯虚拟成员的地址是否合法?
提前致谢
EDIT-1:我删除了问题的第二部分“它是如何工作的?”。看起来这就是引起人们注意的地方。
EDIT-2:我搜索了 c.l.c++.moderated 并发现了这个 link (http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/5ddde8cf1ae59a0d)。共识似乎因为标准没有限制它,所以它是有效的。
EDIT-3: 在阅读了 codeproject 文章(感谢 ovanes)之后,我认为编译器做了一些魔术。由于虚函数是通过 vtable(特定于编译器)实现的,因此获取虚函数的地址总是会给出 vtable 中的偏移量。根据使用的“this”指针,调用适当的函数(其地址位于偏移量处)。我不确定如何证明这一点,因为标准并没有说明任何内容!
【问题讨论】:
标签: c++ inheritance templates