类函数指针和普通函数指针

我们都看惯了一般的函数指针,但是关于类的函数指针又是怎样的呢?它的静态函数指针和非静态函数指针是一样的么?

[cpp]  view plain copy
  1. <span style="font-size:18px">#include<iostream>  
  2. using namespace std;  
  3.   
  4.   
  5. typedef int(*pMax)(int,int);//普通函数指针  
  6.   
  7.   
  8. int max(int a,int b)  
  9. {  
  10. <span style="white-space:pre">  </span>return a>b?a:b;  
  11. }  
  12.   
  13.   
  14. class A  
  15. {  
  16. public:  
  17. <span style="white-space:pre">  </span>int min(int a,int b)  
  18. <span style="white-space:pre">  </span>{  
  19. <span style="white-space:pre">      </span>return a<b?a:b;  
  20. <span style="white-space:pre">  </span>}  
  21.   
  22.   
  23. <span style="white-space:pre">  </span>static int myMin(int a,int b)  
  24. <span style="white-space:pre">  </span>{  
  25. <span style="white-space:pre">      </span>return a<b?a:b;  
  26. <span style="white-space:pre">  </span>}  
  27. };  
  28.   
  29.   
  30. class B:public A  
  31. {  
  32.   
  33.   
  34. };  
  35. typedef int (A::*pMin)(int,int);//类的非静态函数指针  
  36. typedef int (*pMyMin)(int,int);//类的静态函数指针  
  37.   
  38.   
  39. typedef int (B::*pMinB)(int,int);//类的非静态函数指针  
  40.   
  41.   
  42. void main()  
  43. {  
  44. <span style="white-space:pre">  </span>int a=3;  
  45. <span style="white-space:pre">  </span>int b=4;  
  46. <span style="white-space:pre">  </span>  
  47. <span style="white-space:pre">  </span>cout<<max(a,b)<<endl;  
  48. <span style="white-space:pre">  </span>/*    测试普通函数指针    */  
  49. <span style="white-space:pre">  </span>pMax p1=&max;  
  50. <span style="white-space:pre">  </span>cout<<(*p1)(a,b)<<endl;  
  51.   
  52.   
  53. <span style="white-space:pre">  </span>int (*p2)(intint)=&max;  
  54. <span style="white-space:pre">  </span>cout<<(*p2)(a,b)<<endl;  
  55.   
  56.   
  57. <span style="white-space:pre">  </span>/*    测试类的非静态函数指针    */  
  58. <span style="white-space:pre">  </span>A TestA;  
  59. <span style="white-space:pre">  </span>pMin p3=&A::min;  
  60. <span style="white-space:pre">  </span>cout<<(TestA.*p3)(a,b)<<endl;  
  61.   
  62.   
  63. <span style="white-space:pre">  </span>int(A::*p4)(int,int)=&A::min;  
  64. <span style="white-space:pre">  </span>cout<<(TestA.*p4)(a,b)<<endl;  
  65. <span style="white-space:pre">  </span>  
  66.   
  67.   
  68. <span style="white-space:pre">  </span>/*    测试类的静态函数指针    */  
  69. <span style="white-space:pre">  </span>pMyMin p5=&A::myMin;  
  70. <span style="white-space:pre">  </span>cout<<(*p5)(a,b)<<endl;  
  71.   
  72.   
  73. <span style="white-space:pre">  </span>int(*p6)(int,int)=&A::myMin;  
  74. <span style="white-space:pre">  </span>cout<<(*p6)(a,b)<<endl;  
  75.   
  76.   
  77.   
  78.   
  79. <span style="white-space:pre">  </span>/*    测试非静态函数指针在类继承中怎么使用    */  
  80. <span style="white-space:pre">  </span>B TestB;  
  81. <span style="white-space:pre">  </span>pMinB p7=&A::min;  
  82.   
  83.   
  84. <span style="white-space:pre">  </span>cout<<(TestB.*p7)(a,b)<<endl;  
  85. <span style="white-space:pre">  </span>cout<<(TestB.*p3)(a,b)<<endl;  
  86. //<span style="white-space:pre">    </span>cout<<(TestA.*p7)(a,b)<<endl;错误  
  87. }</span>  

从中可以看出,父类对象不可以调用以子类声明的函数指针,而子类对象可以调用以父类声明的函数指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值