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

时间:2016-08-30 07:09:49

标签: c++ function-pointers member-function-pointers

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

#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)行无效。

你能否建议这应该如何运作?感谢。

1 个答案:

答案 0 :(得分:1)

  

你能否建议这应该如何运作?

在这个简单的例子中,B实例的成员函数指针显然具有类B的成员函数的地址,没有必要对此进行测试。

通常,如果我们有一个指针或对未知派生类的实例的引用,那么这样的测试就不能用标准C ++编写。无法获取虚拟调用在运行时解析的函数的地址。

但是,GCC确实有一个extension,可以让你做到这一点。

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

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