如何检查对象实例上的虚函数是一个特定的实现

How to check a virtual function on an object instance is a certain implementation

本文关键字:一个 实现 函数 何检查 检查 对象 实例      更新时间:2023-10-16

我试图检查某个对象实例上的虚拟函数是否来自某个实现。直观地看,它看起来像下面的代码段:

#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)这行不行

你能建议一下这应该如何工作吗?谢谢。

你能建议一下这应该如何工作吗?

在这个简单的例子中,B实例的成员函数指针显然有B类的成员函数的地址,因此测试这一点没有意义。

一般来说,如果有指向未知派生类实例的指针或引用,则不能用标准c++编写此类测试。没有办法在运行时获得虚调用解析到的函数的地址。

但是,GCC确实有一个扩展,允许您这样做。

 typedef int (*fptr)(A *);
 fptr p = (fptr)(a.*fp);

或者,如果编译器记录了它使用的ABI,您可以使用规范从成员函数指针中提取地址。