c++ - 如何在 C++ 中打印成员函数地址

标签 c++ pointers function-pointers pointer-to-member

std::cout好像不能打印成员函数的地址,例如:

#include <iostream>

using std::cout;
using std::endl;

class TestClass
{
  void MyFunc(void);

public:
  void PrintMyFuncAddress(void);
};

void TestClass::MyFunc(void)
{
  return;
}

void TestClass::PrintMyFuncAddress(void)
{
  printf("%p\n", &TestClass::MyFunc);
  cout << &TestClass::MyFunc << endl;
}

int main(void)
{
  TestClass a;

  a.PrintMyFuncAddress();

  return EXIT_SUCCESS;
}

结果是这样的:

003111DB
1

如何使用 std::cout 打印 MyFunc 的地址?

最佳答案

我不相信该语言提供了任何工具来执行此操作。 operator << 有重载流打印正常void*指针,但成员函数指针不能转换为 void* s。这都是特定于实现的,但通常成员函数指针被实现为一对值 - 一个指示成员函数是否为虚拟的标志,以及一些额外的数据。如果该函数是非虚函数,则该额外信息通常是实际成员函数的地址。如果该函数是一个虚函数,那么该额外信息可能包含有关如何索引虚函数表以在给定接收器对象的情况下找到要调用的函数的数据。

一般来说,我认为这意味着如果不调用未定义的行为,就不可能打印出成员函数的地址。您可能必须使用一些特定于编译器的技巧来实现此效果。

希望这会有所帮助!

关于c++ - 如何在 C++ 中打印成员函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111969/

相关文章:

c++ - 您将如何实现黑白棋游戏? (奥赛罗)

c++ - 如何将lambda表达式作为参数传递给可变参数模板类中的mermber函数

c - C 中 fwrite 和 struct 的奇怪错误

c - 参数如何有类型但没有名称?

c++ - 模板类中的模板转换运算符-函数指针

c++ - 从基类调用继承类的重载函数

c++ - 从 Form2 显示 Form1

c++ - 谁能详细告诉我 "*this pointer"?

c - 函数调用期间的内存管理

c# - 回调函数在构建和 DLL 时有何用处