免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6643 | 回复: 6
打印 上一主题 下一主题

[C++] C++ 成员函数指针之间的类型转换 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-04 16:00 |只看该作者 |倒序浏览
最近编程用到了 C++ 成员函数指针之间的类型转换, 我看了一些资料,C++ 成员函数指针实际上是一个结构,而标准好像没有规定如何具体实现成员函数指针,不同的编译器有不同的实现。“在C++的标准化的过程中,在涉及继承的类的成员函数指针时,对于将成员函数指针转化为基类的成员函数指针还是转化为子类成员函数指针的问题和是否可以将一个类的成员函数指针转化为另一个不相关的类的成员函数指针的问题,人们曾有过很激烈的争论。然而不幸的是,在标准委员会做出决定之前,不同的编译器生产商已经根据自己对这些问题的不同的回答实现了自己的编译器。”  摘自 《成员函数指针与高性能的C++委托》  http://blog.csdn.net/hifrog/archive/2004/07/03/33068.aspx

我写了一个测试程序, 用 g++ 编译后,能正常工作,不过我不知道有没有什么隐患?


  1. #include <iostream>
  2. #include <map>

  3. #define   FUN01    1001
  4. #define   FUN02    1002
  5. #define   FUN03    1003

  6. typedef signed int gint32;
  7. typedef unsigned int guint32;

  8. typedef signed long long gint64;


  9. class  ABC;

  10. class  Base
  11. {
  12.     public:       
  13.         virtual ~Base(){};
  14.        
  15.     protected:
  16.         void     reg_func(guint32  a_id_func, char *a_p_func);       

  17.         typedef  void  (ABC::*P_FUNC_CB)(char *ap_a);
  18.         typedef  void  (Base::*P_FUNC)(char *ap_a);


  19.         P_FUNC     p_func;
  20.         P_FUNC_CB  p_func_cb;

  21.         /*
  22.         std::map<guint32, P_FUNC>                    map_func;   
  23.         std::map<guint32, P_FUNC>::iterator          it_map_func;

  24.         typedef  std::pair<guint32, P_FUNC>          Ps_Func;
  25.         */

  26.         std::map<guint32, gint64>                    map_func;   
  27.         std::map<guint32, gint64>::iterator          it_map_func;

  28.         typedef  std::pair<guint32, gint64>          Ps_Func;
  29.        
  30.     public:
  31.         void      call_switch(guint32 id_func);               
  32.         virtual   void  show();               
  33. };  

  34. class   SerAgent : virtual public Base
  35. {
  36.     public:
  37.         virtual  void  show();               
  38.         virtual  void  show_ser_agent();               
  39. };

  40. class  ModuleServer : virtual public Base
  41. {
  42.     public:
  43.         virtual  void  show();               
  44.         virtual  void  show_module_server();               
  45. };

  46. class  ModuleServerCallBack : virtual public ModuleServer, virtual public SerAgent
  47. {
  48.     public:
  49.         void     init();
  50.         virtual  void  show();               
  51.         virtual  void  show_module_server();               

  52.     protected:

  53.         void     fun01(char *ap_a);
  54.         void     fun02(char *ap_a);
  55. };

  56. void  Base::reg_func(guint32  a_id_func, char *a_p_func)
  57. {
  58.         gint64   g64_p_func;
  59.         gint64  *p_g64;
  60.        
  61.         p_g64 = (gint64*)a_p_func;
  62.         g64_p_func = *p_g64;

  63.         map_func.insert(Ps_Func(a_id_func, g64_p_func));       
  64. }

  65. void  Base::call_switch(guint32 id_func)
  66. {
  67.         gint64          g64_p_func;

  68.         bool             find_func = false;

  69.         it_map_func = map_func.find(id_func);
  70.         if (it_map_func == map_func.end())
  71.         {
  72.                 std::cout << "find_function_error" << std::endl;
  73.         }
  74.         else
  75.         {
  76.                 g64_p_func = it_map_func->second;

  77.                 std::cout << "id_fun = " << it_map_func->first << std::endl;

  78.                 memmove((char*)(&p_func), (char*)(&g64_p_func), 8);
  79.                 find_func = true;
  80.         }

  81.         if (find_func)
  82.         {
  83.                 (this->*p_func)("abc");
  84.         }
  85. }

  86. void  Base::show()
  87. {
  88.         std::cout << "Base show" << std::endl;
  89. }
  90.                
  91. void  SerAgent::show()
  92. {
  93.         std::cout << "SerAgent show" << std::endl;
  94. }
  95.        
  96. void  ModuleServer::show()
  97. {
  98.         std::cout << "ModuleServer show" << std::endl;
  99. }

  100. void  SerAgent::show_ser_agent()
  101. {
  102.         std::cout << "show_ser_agent show" << std::endl;
  103. }               

  104. void  ModuleServer::show_module_server()               
  105. {
  106.         std::cout << "show_module_server show" << std::endl;
  107. }
  108.                
  109. void  ModuleServerCallBack::show()
  110. {
  111.         std::cout << "ModuleServerCallBack show" << std::endl;
  112. }               

  113. void  ModuleServerCallBack::show_module_server()
  114. {
  115.         std::cout << "ModuleServerCallBack show_module_server" << std::endl;
  116. }               

  117. void  ModuleServerCallBack::init()
  118. {
  119.         std::cout << "ModuleServerCallBack::init" << std::endl;

  120.         p_func_cb = (P_FUNC_CB)(&ModuleServerCallBack::fun01);
  121.         reg_func(FUN01, (char*)&p_func_cb);

  122.         p_func_cb = (P_FUNC_CB)(&ModuleServerCallBack::fun02);
  123.         reg_func(FUN02, (char*)&p_func_cb);
  124. }               

  125. void  ModuleServerCallBack::fun01(char *ap_a)
  126. {
  127.         std::cout << "ModuleServerCallBack::fun01 " << ap_a << std::endl;       
  128. }

  129. void  ModuleServerCallBack::fun02(char *ap_a)
  130. {
  131.         std::cout << "ModuleServerCallBack::fun02 " << ap_a << std::endl;
  132. }

  133. int main(int argc, char *argv[])
  134. {
  135.         Base  *p_b;

  136.         ModuleServer  *p_ms;

  137.         ModuleServerCallBack  *p_cb = new ModuleServerCallBack;

  138.         p_cb->init();

  139.         p_b = p_cb;

  140.         p_b->show();

  141.         p_ms = p_cb;

  142.         p_ms->show_module_server();

  143.         p_b->call_switch(FUN01);
  144.         p_b->call_switch(FUN02);
  145.         p_b->call_switch(FUN03);

  146.         return 0;        
  147. }

复制代码

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
2 [报告]
发表于 2007-10-08 11:19 |只看该作者

回复 #1 zhujiang73 的帖子

原帖由 zhujiang73 于 2007-10-4 16:00 发表
最近编程用到了 C++ 成员函数指针之间的类型转换, 我看了一些资料,C++ 成员函数指针实际上是一个结构,而标准好像没有规定如何具体实现成员函数指针,不同的编译器有不同的实现。“在C++的标准化的过程中,在 ...


发现问题了,我好像把内存搞乱了:



  1. #include <iostream>
  2. #include <map>

  3. #define   FUN01    1001
  4. #define   FUN02    1002
  5. #define   FUN03    1003

  6. typedef signed int gint32;
  7. typedef unsigned int guint32;

  8. typedef signed long long gint64;


  9. class  ABC;

  10. class  Base
  11. {
  12.     public:      
  13.         virtual ~Base(){};

  14.     protected:
  15.         //char     buf[4096];

  16.     protected:
  17.         void     reg_func(guint32  a_id_func, char *a_p_func);      

  18.         typedef  void  (ABC::*P_FUNC_CB)(char *ap_a);
  19.         typedef  void  (Base::*P_FUNC)(char *ap_a);


  20.         P_FUNC     p_func;
  21.         P_FUNC_CB  p_func_cb;


  22.         std::map<guint32, gint64>                    map_func;   
  23.         std::map<guint32, gint64>::iterator          it_map_func;

  24.         typedef  std::pair<guint32, gint64>          Ps_Func;
  25.       
  26.     public:
  27.         void      call_switch(guint32 id_func);               
  28.         virtual   void  show();               
  29. };  

  30. class   SerAgent : virtual public Base
  31. {
  32.     public:
  33.         void  show();               
  34. };

  35. class  ModuleServer : virtual public Base
  36. {
  37.     public:
  38.         void  show();               
  39. };

  40. class  ModuleServerCallBack : virtual public ModuleServer, virtual public SerAgent
  41. {
  42.     public:
  43.         void     init();
  44.         virtual  void  show();               

  45.     protected:
  46.         gint32   test01;
  47.       
  48.     protected:

  49.         void     fun01(char *ap_a);
  50.         void     fun02(char *ap_a);
  51. };

  52. void  Base::reg_func(guint32  a_id_func, char *a_p_func)
  53. {
  54.         gint64   g64_p_func;
  55.         gint64  *p_g64;
  56.       
  57.         p_g64 = (gint64*)a_p_func;
  58.         g64_p_func = *p_g64;

  59.         map_func.insert(Ps_Func(a_id_func, g64_p_func));      
  60. }

  61. void  Base::call_switch(guint32 id_func)
  62. {
  63.         gint64           g64_p_func;

  64.         bool             find_func = false;

  65.         it_map_func = map_func.find(id_func);
  66.         if (it_map_func == map_func.end())
  67.         {
  68.                 std::cout << "find_function_error" << std::endl;
  69.         }
  70.         else
  71.         {
  72.                 g64_p_func = it_map_func->second;

  73.                 std::cout << "id_fun = " << it_map_func->first << std::endl;

  74.                 memmove((char*)(&p_func), (char*)(&g64_p_func), 8);
  75.                 find_func = true;
  76.         }

  77.         if (find_func)
  78.         {
  79.                 (this->*p_func)("abc");
  80.         }
  81. }

  82. void  Base::show()
  83. {
  84.         std::cout << "Base show" << std::endl;
  85. }
  86.                
  87. void  SerAgent::show()
  88. {
  89.         std::cout << "SerAgent show" << std::endl;
  90. }
  91.       
  92. void  ModuleServer::show()
  93. {
  94.         std::cout << "ModuleServer show" << std::endl;
  95. }
  96.                
  97. void  ModuleServerCallBack::show()
  98. {
  99.         std::cout << "ModuleServerCallBack show" << std::endl;
  100. }               

  101. void  ModuleServerCallBack::init()
  102. {
  103.         test01 = 10;

  104.         std::cout << "ModuleServerCallBack::init" << std::endl;

  105.         p_func_cb = (P_FUNC_CB)(&ModuleServerCallBack::fun01);
  106.         reg_func(FUN01, (char*)&p_func_cb);

  107.         p_func_cb = (P_FUNC_CB)(&ModuleServerCallBack::fun02);
  108.         reg_func(FUN02, (char*)&p_func_cb);
  109. }               

  110. void  ModuleServerCallBack::fun01(char *ap_a)
  111. {
  112.         std::cout << "ModuleServerCallBack::fun01 " << ap_a << std::endl;      
  113. }

  114. void  ModuleServerCallBack::fun02(char *ap_a)
  115. {
  116.         std::cout << "test01 = " << test01 << std::endl;   // 不能正确访问到 test01

  117.         std::cout << "ModuleServerCallBack::fun02 " << ap_a << std::endl;
  118. }

  119. int main(int argc, char *argv[])
  120. {
  121.         Base  *p_b;

  122.         ModuleServer  *p_ms;

  123.         ModuleServerCallBack  *p_cb = new ModuleServerCallBack;

  124.         p_cb->init();

  125.         p_b = p_cb;

  126.         p_b->show();

  127.         p_b->call_switch(FUN01);
  128.         p_b->call_switch(FUN02);
  129.         p_b->call_switch(FUN03);

  130.         return 0;        
  131. }
复制代码

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
3 [报告]
发表于 2007-10-08 13:12 |只看该作者

回复 #2 zhujiang73 的帖子

原帖由 zhujiang73 于 2007-10-8 11:19 发表


发现问题了,我好像把内存搞乱了:



#include
#include

#define   FUN01    1001
#define   FUN02    1002
#define   FUN03    1003

typedef signed int gint32;
typedef unsig ...


发现单继承时,程序能正常工作:


  1. #include <iostream>
  2. #include <map>

  3. #define   FUN01    1001
  4. #define   FUN02    1002
  5. #define   FUN03    1003

  6. typedef signed int gint32;
  7. typedef unsigned int guint32;

  8. typedef signed long long gint64;


  9. class  ABC;

  10. class  Base
  11. {
  12.     public:      
  13.         virtual ~Base(){};

  14.     protected:
  15.         //char     buf[4096];

  16.     protected:
  17.         void     reg_func(guint32  a_id_func, char *a_p_func);      

  18.         typedef  void  (ABC::*P_FUNC_CB)(char *ap_a);
  19.         typedef  void  (Base::*P_FUNC)(char *ap_a);


  20.         P_FUNC     p_func;
  21.         P_FUNC_CB  p_func_cb;


  22.         std::map<guint32, gint64>                    map_func;   
  23.         std::map<guint32, gint64>::iterator          it_map_func;

  24.         typedef  std::pair<guint32, gint64>          Ps_Func;
  25.       
  26.     public:
  27.         void      call_switch(guint32 id_func);               
  28.         virtual   void  show();               
  29. };  

  30. class  ModuleServerCallBack : public Base
  31. {
  32.     public:
  33.         void  init();
  34.         void  show();               

  35.     protected:
  36.         gint32   test01;
  37.       
  38.     protected:

  39.         void     fun01(char *ap_a);
  40.         void     fun02(char *ap_a);
  41. };

  42. void  Base::reg_func(guint32  a_id_func, char *a_p_func)
  43. {
  44.         gint64   g64_p_func;
  45.         gint64  *p_g64;
  46.       
  47.         p_g64 = (gint64*)a_p_func;
  48.         g64_p_func = *p_g64;

  49.         map_func.insert(Ps_Func(a_id_func, g64_p_func));      
  50. }

  51. void  Base::call_switch(guint32 id_func)
  52. {
  53.         gint64           g64_p_func;

  54.         bool             find_func = false;

  55.         it_map_func = map_func.find(id_func);
  56.         if (it_map_func == map_func.end())
  57.         {
  58.                 std::cout << "find_function_error" << std::endl;
  59.         }
  60.         else
  61.         {
  62.                 g64_p_func = it_map_func->second;

  63.                 std::cout << "id_fun = " << it_map_func->first << std::endl;

  64.                 memmove((char*)(&p_func), (char*)(&g64_p_func), 8);
  65.                 find_func = true;
  66.         }

  67.         if (find_func)
  68.         {
  69.                 (this->*p_func)("abc");
  70.         }
  71. }

  72. void  Base::show()
  73. {
  74.         std::cout << "Base show" << std::endl;
  75. }
  76.                               
  77. void  ModuleServerCallBack::show()
  78. {
  79.         std::cout << "ModuleServerCallBack show" << std::endl;
  80. }               

  81. void  ModuleServerCallBack::init()
  82. {
  83.         test01 = 10;

  84.         std::cout << "ModuleServerCallBack::init" << std::endl;

  85.         p_func_cb = (P_FUNC_CB)(&ModuleServerCallBack::fun01);
  86.         reg_func(FUN01, (char*)&p_func_cb);

  87.         p_func_cb = (P_FUNC_CB)(&ModuleServerCallBack::fun02);
  88.         reg_func(FUN02, (char*)&p_func_cb);
  89. }               

  90. void  ModuleServerCallBack::fun01(char *ap_a)
  91. {
  92.         std::cout << "ModuleServerCallBack::fun01 " << ap_a << std::endl;      
  93. }

  94. void  ModuleServerCallBack::fun02(char *ap_a)
  95. {
  96.         std::cout << "test01 = " << test01 << std::endl;

  97.         std::cout << "ModuleServerCallBack::fun02 " << ap_a << std::endl;
  98. }

  99. int main(int argc, char *argv[])
  100. {
  101.         Base  *p_b;

  102.         ModuleServerCallBack  *p_cb = new ModuleServerCallBack;

  103.         p_cb->init();

  104.         p_b = p_cb;

  105.         p_b->show();

  106.         p_b->call_switch(FUN01);
  107.         p_b->call_switch(FUN02);
  108.         p_b->call_switch(FUN03);

  109.         return 0;        
  110. }

复制代码

[ 本帖最后由 zhujiang73 于 2007-10-8 13:14 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-10-08 13:55 |只看该作者
:wink:

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
5 [报告]
发表于 2007-10-09 13:11 |只看该作者

回复 #2 zhujiang73 的帖子

原帖由 zhujiang73 于 2007-10-8 11:19 发表


发现问题了,我好像把内存搞乱了:


成员函数指针不能转换,我这次用虚函数解决问题。


  1. #include <iostream>
  2. #include <map>

  3. #define   FUN01    1001
  4. #define   FUN02    1002
  5. #define   FUN03    1003

  6. typedef signed int gint32;
  7. typedef unsigned int guint32;

  8. typedef signed long long gint64;


  9. class  Base
  10. {
  11.     public:      
  12.         virtual ~Base(){};
  13.       
  14.     protected:
  15.         void     reg_func(guint32  a_id_func, char *a_p_func);      
  16.         bool     find_func(guint32  a_id_func, gint64  &g64_p_func);               

  17.     protected:
  18.         std::map<guint32, gint64>                    map_func;   
  19.         std::map<guint32, gint64>::iterator          it_map_func;

  20.         typedef  std::pair<guint32, gint64>          Ps_Func;
  21.       
  22.     public:
  23.         virtual  void  call_switch(guint32 a_id_func, char *ap_a){};               
  24.         virtual  void  show();               
  25. };  

  26. class   SerAgent : virtual public Base
  27. {
  28.     public:
  29.         virtual  void  show();               
  30. };

  31. class  ModuleServer : virtual public Base
  32. {
  33.     public:
  34.         virtual  void  show();               
  35. };

  36. class  ModuleServerCallBack : virtual public ModuleServer, virtual public SerAgent
  37. {
  38.     public:
  39.         void     init();
  40.         void     show();               
  41.         void     call_switch(guint32 a_id_func, char *ap_a);               

  42.     protected:
  43.         typedef  void  (ModuleServerCallBack::*P_FUNC)(char *ap_a);

  44.         gint32     test01;      

  45.     protected:
  46.         void     fun01(char *ap_a);
  47.         void     fun02(char *ap_a);
  48. };

  49. void  Base::reg_func(guint32  a_id_func, char *a_p_func)
  50. {
  51.         gint64   g64_p_func;
  52.         gint64  *p_g64;
  53.       
  54.         p_g64 = (gint64*)a_p_func;
  55.         g64_p_func = *p_g64;

  56.         map_func.insert(Ps_Func(a_id_func, g64_p_func));      
  57. }

  58. bool  Base::find_func(guint32  a_id_func, gint64  &a_g64_p_func)
  59. {
  60.         bool             found_func = false;

  61.         it_map_func = map_func.find(a_id_func);
  62.         if (it_map_func == map_func.end())
  63.         {
  64.                 std::cout << "can not found function id_func = " << a_id_func << std::endl;
  65.         }
  66.         else
  67.         {
  68.                 a_g64_p_func = it_map_func->second;
  69.                 std::cout << "id_func = " << it_map_func->first << std::endl;
  70.                 found_func = true;
  71.         }

  72.         return  found_func;
  73. }               

  74. void  Base::show()
  75. {
  76.         std::cout << "Base show" << std::endl;
  77. }
  78.                
  79. void  SerAgent::show()
  80. {
  81.         std::cout << "SerAgent show" << std::endl;
  82. }
  83.       
  84. void  ModuleServer::show()
  85. {
  86.         std::cout << "ModuleServer show" << std::endl;
  87. }
  88.                
  89. void  ModuleServerCallBack::show()
  90. {
  91.         std::cout << "ModuleServerCallBack show" << std::endl;
  92. }               

  93. void  ModuleServerCallBack::init()
  94. {
  95.         std::cout << "ModuleServerCallBack::init" << std::endl;

  96.         test01 = 10;

  97.         P_FUNC     p_func;

  98.         p_func = &ModuleServerCallBack::fun01;
  99.         reg_func(FUN01, (char*)&p_func);

  100.         p_func = &ModuleServerCallBack::fun02;
  101.         reg_func(FUN02, (char*)&p_func);
  102. }               

  103. void  ModuleServerCallBack::call_switch(guint32 a_id_func, char *ap_a)
  104. {
  105.         P_FUNC     p_func;
  106.         gint64     g64_p_func;

  107.         if (find_func(a_id_func, g64_p_func))
  108.         {
  109.                 memmove((char*)&p_func, (char*)&g64_p_func, 8);
  110.                 (this->*p_func)(ap_a);
  111.         }
  112. }

  113. void  ModuleServerCallBack::fun01(char *ap_a)
  114. {
  115.         std::cout << "ModuleServerCallBack::fun01 out: " << ap_a << std::endl;      
  116. }

  117. void  ModuleServerCallBack::fun02(char *ap_a)
  118. {
  119.         std::cout << "ModuleServerCallBack::fun02 out: " << ap_a << std::endl;

  120.         std::cout << "test01 = " << test01 << std::endl;
  121. }

  122. int main(int argc, char *argv[])
  123. {
  124.         Base  *p_b;

  125.         ModuleServer  *p_ms;

  126.         ModuleServerCallBack  *p_cb = new ModuleServerCallBack;

  127.         p_cb->init();

  128.         p_b = p_cb;

  129.         p_b->show();

  130.         p_ms = p_cb;

  131.         p_b->call_switch(FUN01, "123");
  132.         p_b->call_switch(FUN02, "456");
  133.         p_b->call_switch(FUN03, "789");

  134.         return 0;        
  135. }


复制代码

论坛徽章:
0
6 [报告]
发表于 2007-10-09 13:42 |只看该作者
函数地址传出来了吗?
“  if (find_func(a_id_func, g64_p_func))”

这个转化没所谓的,一个类型而已;实际执行的实际函数不变就行,

假设f1是类a的,f2是类b的,
我有一个指针p1指向f1,类型是f2,又有什么关系?
只要我想执行的函数是f1就可以了,类型什么样没什么关系,我也不关心。

当然类型不能太离谱,比如,少个参数,参数类型不一样,等等,这样程序容易崩溃。

[ 本帖最后由 yuanchengjun 于 2007-10-9 13:54 编辑 ]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
7 [报告]
发表于 2007-10-09 14:45 |只看该作者

回复 #6 yuanchengjun 的帖子

原帖由 yuanchengjun 于 2007-10-9 13:42 发表
函数地址传出来了吗?
“  if (find_func(a_id_func, g64_p_func))”

这个转化没所谓的,一个类型而已;实际执行的实际函数不变就行,

假设f1是类a的,f2是类b的,
我有一个指针p1指向f1,类型是f2,又 ...


>> 函数地址传出来了吗?
那我调用的是鬼?     

>> 我有一个指针p1指向f1,类型是f2
这样不能通过编译。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP