类成员函数的指针与多态性

1 类成员函数的指针

2 类成员函数的指针数组

3 指向类成员函数的指针的指针

1 类成员函数的指针

auto func1 = &com::jia;//C++函数指针

int (com::*p)(int, int) = &com::jia;//C函数指针

 1 #include <iostream>
 2
 3 class com
 4 {
 5 private:
 6     int a;
 7     int b;
 8 public:
 9     com(int x, int y) :a(x), b(y)
10     {
11
12     }
13     int jia(int a, int b)
14     {
15         return a + b;
16     }
17     int jian(int a, int b)
18     {
19         return a - b;
20     }
21     int cheng(int a, int b)
22     {
23         return a*b;
24     }
25     double chu(int a, int b)
26     {
27         return a / b;
28     }
29 };
30
31 void main()
32 {
33     com com1(100, 20);
34
35     auto func1 = &com::jia;//C++函数指针
36     int (com::*p)(int, int) = &com::jia;//C函数指针
37
38     std::cout << typeid(func1).name() << std::endl;//打印数据类型,上下一样
39     std::cout << typeid(p).name() << std::endl;//打印数据类型,上下一样
40
41     system("pause");
42 }

2 类成员函数的指针数组

typedef int(com::*P)(int, int);

P func1[4] = { &com::jia ,&com::jian,&com::cheng,&com::chu };//使用typedef

int(com::*func2[4])(int, int) = { &com::jia ,&com::jian,&com::cheng,&com::chu };//不使用typedef

 1 #include <iostream>
 2
 3 class com
 4 {
 5 private:
 6     int a;
 7     int b;
 8 public:
 9     com(int x, int y) :a(x), b(y)
10     {
11
12     }
13     int jia(int a, int b)
14     {
15         return a + b;
16     }
17     int jian(int a, int b)
18     {
19         return a - b;
20     }
21     int cheng(int a, int b)
22     {
23         return a*b;
24     }
25     int chu(int a, int b)
26     {
27         return a / b;
28     }
29 };
30
31 typedef int(com::*P)(int, int);
32
33 void main()
34 {
35     com com1(100, 20);
36
37     P func1[4] = { &com::jia ,&com::jian,&com::cheng,&com::chu };//使用typedef
38
39     int(com::*func2[4])(int, int) = { &com::jia ,&com::jian,&com::cheng,&com::chu };//不使用typedef
40
41     for (int i = 0; i < 4; i++)
42     {
43         std::cout << (com1.*func1[i])(10, 20) << std::endl;
44         std::cout << (com1.*func2[i])(10, 20) << std::endl;
45         std::cout << std::endl;
46     }
47
48     system("pause");
49 }

3 指向类成员函数的指针的指针

 1 #include <iostream>
 2
 3 class com
 4 {
 5 private:
 6     int a;
 7     int b;
 8 public:
 9     com(int x, int y) :a(x), b(y)
10     {
11
12     }
13     int jia(int a, int b)
14     {
15         return a + b;
16     }
17     int jian(int a, int b)
18     {
19         return a - b;
20     }
21     int cheng(int a, int b)
22     {
23         return a*b;
24     }
25     int chu(int a, int b)
26     {
27         return a / b;
28     }
29 };
30
31 typedef int(com::*P)(int, int);
32
33 void main()
34 {
35     com com1(100, 20);
36
37     P func1[4] = { &com::jia ,&com::jian,&com::cheng,&com::chu };//使用typedef
38
39     int(com::*func2[4])(int, int) = { &com::jia ,&com::jian,&com::cheng,&com::chu };//不使用typedef
40
41     int(com::**funcp)(int, int) = func1;//二级指针,指向类成员函数的指针的指针
42
43     for (; funcp < func1 + 4; funcp++)//指针遍历数组
44     {
45         std::cout << (com1.**funcp)(10, 20) << std::endl;
46     }
47
48     system("pause");
49 }
时间: 2024-12-28 17:35:07

类成员函数的指针与多态性的相关文章

C++ 面向对象 类成员函数this指针

每个类成员函数都只涉及一个对象, 即调用它的对象. 但有时候方法可能涉及到两个对象, 在这种情况下需要使用C++ 的 this 指针 假设将方法命名为topval(), 则函数调用stock1.topval()将访问stock1的对象数据:stock2.topval()将访问stock2的对象数据: 如果希望该方法的两个对象进行对比, 则必须将第二个对象作为参数传递给它.这时候涉及到隐式和显式: top = stock1.topval(stock2); 隐式的访问了stock1, 显示的访问了s

类的成员函数的指针

前面一篇文章<函数的指针 >介绍了全局函数的指针,现在我们再来介绍一下成员函数的指针. 成员函数指针的定义: 一般形式 Return_Type (Class_Name::* pointer_name) (Argument_List); 用typedef简化的形式 Typedef Return_Type (Class_Name::* FuncPtr_Type) (Argument_List); FuncPtr_Type pFunc = NULL; //pFunc为成员函数指针的指针变量 成员函数

C++的类成员和类成员函数指针

类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员函数,它是类对象共享的,且只能处理静态数据成员,所以它的函数指针可以类似一般函数指针一样使用. 1 class Test 2 { 3 public: 4 void fun(int); 5 void fun(int) const; //重载函数,加一个const限制 6 static void fun

让类成员函数指针成为可调用对象

类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象. 一般情况下调用类成员函数指针: // a.h #ifndef A_H #define A_H #include <iostream> using std::cout; using std::endl; class A{ public:     void print(); }; #endif // a.cpp #include "a.h" vo

C/C++ 类成员函数指针 类成员数据指针

普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*ptr_name)(para_types)" 类数据成员指针: "type class_name::* ptr_name"; C/C++: 1 class Demo 2 { 3 public: 4 Demo():data(100) 5 { 6 7 } 8 int data; 9 i

函数指针与类成员函数指针

1,函数指针函数指针,顾名思义就是函数的指针,而指针其实就是地址,那么函数指针就是存储函数的地址,可是实际大部分时间里,我们写程序时是根本不会去考虑函数地址在哪里.我们只需要知道函数原型和函数声明就可以.但是想象一下,我们总是以为函数就应该接收参数,那么函数本身是否可以作为函数的参数呢?我做了下面的一个实验 #include<iostream>#include<stdio.h>#include<cstring>using namespace std;typedef in

类成员函数的重载、覆盖和隐藏区别?

1.重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同).实现原理上:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的).如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;.那么编译器做过修饰后的函数名称可能是这样的:int_func.str_func.对于这两个函数的调用,在编

C++ 获取类成员函数地址方法 浅析

C语言中可以用函数地址直接调用函数: void print () { printf ("function print"); } typdef void (*fun)(); fun f = print; f(); C++中类非静态成员函数必须通过实例去调用,C++中类成员函数调用: class test { public: void print () { printf ("function print"); } }; 我们同样可以通过定义函数指针来调用如下: type

c++: 指向类成员函数的指针

指向函数的指针有和指向类成员函数的指针的有什么不同? int f(char a, float b);如果它是普通函数,则它的类型是 int (*)(char, float);如果它是非静态成员函数,则它的类型是 int(ClassName::*)(char, float);如果它是静态成员函数,则它的类型是和普通函数一样. 如何把一个类的成员函数传递给event handler, 线程启动函数等? 类的成员函数必须和一个类的实例结合起来才有意义.可以写一个函数来包装类的成员函数. class X