一、函数指针——基本形式

char Fun(int n) { return char(n); }
//char(*pFun)(int); void main()
{
char(*pFun)(int);
pFun = Fun;
char c = (*pFun)();
cout << c;
}

二、函数指针——typedef形式

char Fun(int n) { return char(n); }
//typedef char(*PFun)(int);
//PFun pFun; void main()
{
typedef char(*PFun)(int);
PFun pFun;
pFun = Fun;
char c = (*pFun)();
cout << c;
}

三、类成员函数指针

class Base
{
public:
char Fun(int n) { return char(n); }
}; //typedef char (Base::*PFun)(int);
//PFun pFun; void main()
{
typedef char (Base::*PFun)(int);
PFun pFun;
pFun = &Base::Fun;
Base instance;
char c = (instance.*pFun)();
cout << c;
}

四、类成员函数指针——类指针

class Base
{
public:
char Fun(int n) { return char(n); }
}; //typedef char (Base::*PFun)(int);
//PFun pFun; void main()
{
typedef char (Base::*PFun)(int);
PFun pFun;
pFun = &Base::Fun;
Base *pInstance = new Base();
char c = (pInstance->*pFun)();
delete pInstance;
cout << c;
}

五、类成员函数指针——内部调用(this->*)

class Base
{
public:
char Fun(int n) { return char(n); }
char Fun2()
{
char (Base::*pFun)(int);
pFun = &Base::Fun;
char c = (this->*pFun)();
return c;
}
}; void main()
{
Base instance;
char c = instance.Fun2();
cout << c;
}

六、类成员函数指针——继承调用

class Base
{
public:
char Fun(int n) { return char(n); } char Fun2(int n)
{
//char (Base::*pFun)(int);
//pFun = &Base::Fun;
typedef char (Base::*PFun)(int);
PFun pFun = &Base::Fun;
return Proc(n, pFun);
} char Proc(int n, char(Base::*pFun)(int))
{
return (this->*pFun)(n);
}
}; class Derive : Base
{
public:
char Fun(int n) { return char(n - ); } char Fun2(int n)
{
typedef char (Base::*PFun)(int);
PFun pFun = static_cast<PFun>(&Derive::Fun);
return Proc(n, pFun);
}
}; void main()
{
Base base;
char bc = base.Fun2();
cout << bc; Derive derive;
char dc = derive.Fun2();
cout << dc;
}

七、类成员函数指针——虚拟函数

class Base
{
public:
void OFun() { cout << "base ordinary" << endl; }
virtual void VFun(int i) { cout << "base virtual" << endl; }
}; class Derive : public Base
{
public:
void OFun() { cout << "derive ordinary" << endl; }
virtual void VFun(int i) { cout << "derive virtual" << endl; }
}; void main()
{
typedef void (Base::*BaseOFun)();
typedef void (Derive::*DeriveOFun)();
BaseOFun baseOFun = &Base::OFun;
DeriveOFun deriveOFun = static_cast<DeriveOFun>(baseOFun); typedef void (Base::*BaseVFun)(int);
typedef void (Derive::*DeriveVFun)(int);
BaseVFun baseVFun = &Base::VFun;
DeriveVFun deriveFVun = static_cast<DeriveVFun>(baseVFun); Base base;
(base.*baseOFun)();
(base.*baseVFun)(); Derive derive;
(derive.*deriveOFun)();
(derive.*deriveFVun)();
}

C++函数指针和类成员函数指针的更多相关文章

  1. C++函数指针相关 & 类成员的指针 & 成员函数的指针

    有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...

  2. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  3. mfc 类成员函数

    知识点 类成员变量初值 类的构造函数 类成员函数 类成员函数的位置 一.类成员变量初值 二.类的构造函数 构造函数 是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值. 构造函 ...

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

    类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...

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

    普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...

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

    每个类成员函数都只涉及一个对象, 即调用它的对象. 但有时候方法可能涉及到两个对象, 在这种情况下需要使用C++ 的 this 指针 假设将方法命名为topval(), 则函数调用stock1.top ...

  7. 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)

    下面讨论的都是类的非静态成员函数. 类成员函数指针的声明及调用: 1 2 3 4 5 6 7 //pr是指向Base类里的非静态成员函数的指针 //其行参为(int, int),返回值为void vo ...

  8. this指针和const成员函数

    1.this指针 1)this指针是成员函数的隐式参数,成员函数通过this指针来访问调用它自己的那个对象,成员函数对各成员的访问均通过this进行 2)当某个对象调用它的成员函数时,编译器会把这个对 ...

  9. 类成员函数作为pthread_create函数参数

    from:http://www.cnblogs.com/shijingxiang/articles/5389294.html 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数 ...

随机推荐

  1. [CodePlus2017NOV]晨跑

    题目大意: 三个人分别以a,b,c的速度在一个圈上晨跑,在时间为0时,他们一起出发,问何时能相遇? 思路: lcm(a,b,c)即可. #include<cstdio> #include& ...

  2. IO多路复用 select、poll、epoll

    什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...

  3. Ubuntu 16.04通过APT源安装QUEM虚拟机调试Linux内核

    安装: sudo apt-add-repository main sudo apt-get update sudo apt-get install qemu-kvm qemu virt-manager ...

  4. WPF附加属性的Set函数不调用的问题

    今天写程序的时候用到了附加属性,我是用VS内置的propa的代码段来实现的,代码如下: class Attach    {        public static bool GetIsEnabled ...

  5. rem 自适应

    最近在写一个关于小说阅读的webApp,由于没有借用任何框架,所以很多底层的内容都需要自己去解决,幸好的是这次只是关于移动端的内容,还不至于去向着jquery的方向码代码.言归正传,前几天在处理底色切 ...

  6. SVN安装中遇到的问题

    新的版本:1.9.5 必须使用Apache Portable Runtime Utility 1.5.4 Released没有安装的话需要先安装 需要安装apr.apr-util sqlite zli ...

  7. webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc «(», expected punc

  8. SQLSERVER调用DLL程序

    在SQL Server中调用dll分为两个步骤 1.创建一个dll文件(dll文件分成3种类型,讲其中一种) 2.把dll文件放进SQL Server的程序集中.然后定义一个Function,就可以通 ...

  9. python - ImportError: No module named pywintypes

    must restart the python shell to avoid this issue after pywin32 installed

  10. 防止木马利用iframe框架来调用外域JS代码

    <!--防止木马利用iframe框架来调用外域JS代码,不过滤自己网站的域名的框架网页开始--><SCRIPT LANGUAGE="JavaScript"> ...