打印成员函数地址的最简单方法是什么?

时间:2011-08-23 19:10:17

标签: c++

如果我有一个带有纯虚函数的基类,以及一个实现该函数的派生类 - 我最简单的方法是打印出函数实际调用的地址吗?

class A { public: virtual void func()=0; }

class B:A { 
    public: 
        void func() { /*implementation*/ }
        void func2() { *** I WANT TO PRINT THE ADDRESS OF func() HERE! *** }
};

另外,在类中打印静态函数的地址以及打印出全局函数地址的最简单方法是什么?

4 个答案:

答案 0 :(得分:2)

c ++没有提供任何可移植的方法来打印虚函数的地址。

答案 1 :(得分:1)

最简单的方法是找出让链接器输出链接映射的选项,并在那里查找函数名称。

答案 2 :(得分:0)

[编辑]据我所知,无论虚拟性如何,都无法获得实际的函数地址。具体而言,对于虚拟方法,虚拟分派的方法和目的地留给实现。但是,即使对于普通函数,函数指针也可能不是函数的实际代码地址(尽管我怀疑它存在这种情况)。

答案 3 :(得分:0)

方法指针并不总是地址。实际上(在gcc上)有两件事:

  • 偏移
  • 地址或索引

当成员函数指针的最后一位为1时,第二部分是 vtable 中的偏移量,表示要调用的方法,否则它是成员函数的地址。 偏移量将添加到指针。

这就是成员函数指针大于公共指针的原因。此外,您应该注意到与函数指针相反,使用成员函数指针会产生开销。