我正在尝试检查某个对象实例上的虚函数是否来自某个实现。直观地看起来像下面的代码段:
#include <cstdio>
using namespace std;
class A
{
public:
virtual void method()
{
printf("This is from A \n");
}
};
class B : public A
{
public:
virtual void method()
{
printf("This is from B \n");
}
};
int main()
{
B b;
b.method();
if (b.&method == &B::method)
{
printf("Horray! simple. \n");
}
return 0;
}
但很明显,if (b.&method == &B::method)
行无效。
你能否建议这应该如何运作?感谢。
答案 0 :(得分:1)
你能否建议这应该如何运作?
在这个简单的例子中,B
实例的成员函数指针显然具有类B
的成员函数的地址,没有必要对此进行测试。
通常,如果我们有一个指针或对未知派生类的实例的引用,那么这样的测试就不能用标准C ++编写。无法获取虚拟调用在运行时解析的函数的地址。
但是,GCC确实有一个extension,可以让你做到这一点。
typedef int (*fptr)(A *);
fptr p = (fptr)(a.*fp);
或者,如果编译器记录它使用的ABI,您可以使用该规范从成员函数指针中提取地址。