C++函数指针和类成员函数指针
一、函数指针——基本形式
- 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++函数指针和类成员函数指针的更多相关文章
- C++函数指针相关 & 类成员的指针 & 成员函数的指针
有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...
- 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上? 成员函数可以被看作是类 ...
- mfc 类成员函数
知识点 类成员变量初值 类的构造函数 类成员函数 类成员函数的位置 一.类成员变量初值 二.类的构造函数 构造函数 是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值. 构造函 ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
- C/C++ 类成员函数指针 类成员数据指针
普通函数指针: "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...
- C++ 面向对象 类成员函数this指针
每个类成员函数都只涉及一个对象, 即调用它的对象. 但有时候方法可能涉及到两个对象, 在这种情况下需要使用C++ 的 this 指针 假设将方法命名为topval(), 则函数调用stock1.top ...
- 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)
下面讨论的都是类的非静态成员函数. 类成员函数指针的声明及调用: 1 2 3 4 5 6 7 //pr是指向Base类里的非静态成员函数的指针 //其行参为(int, int),返回值为void vo ...
- this指针和const成员函数
1.this指针 1)this指针是成员函数的隐式参数,成员函数通过this指针来访问调用它自己的那个对象,成员函数对各成员的访问均通过this进行 2)当某个对象调用它的成员函数时,编译器会把这个对 ...
- 类成员函数作为pthread_create函数参数
from:http://www.cnblogs.com/shijingxiang/articles/5389294.html 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数 ...
随机推荐
- Saga的实现模式——控制者(Saga implementation patterns – Controller)
https://lostechies.com/jimmybogard/2013/03/14/saga-implementation-patterns-controller/ 之前的文章中我们介绍了观察 ...
- D3.js系列——初步使用、选择元素与绑定数据
D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可 ...
- Linux源码编译安装MySQL5.7
目录[-] 一.环境准备: 二.升级系统: 三.做一些准备工作(以下Linux命令均在su到root用户操作): 四.开始编译安装mysql-5.7.9: 一.环境准备: 我尝试过以下环境都是能成功的 ...
- 手写一个死锁Demo
相互持有对方锁,导致死锁 package jesse.test04; public class DeadLockSample extends Thread{ private String first; ...
- C#文本框中默认是不允许使用全选的
C#文本框中默认是不允许使用全选的.可以通过以下事件完成: private void textBox1_KeyDown(object sender, KeyEventArgs e) { i ...
- 初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具
FASTBuild 是一款高性能.开源的构建系统,支持高度可扩展的编译,缓存和网络分发. 以上是FASTBuild官网对其产品的一句话介绍. FASTBuild 的开源地址:https://githu ...
- ffmpeg 复用
aa 将mkv中的音视频复用成ts流: ffmpeg -i 32_mkv_h264_718x480_ac3.mkv -codec copy -bsf:v h264_mp4toannexb -f m ...
- Python学习笔记(四)多进程的使用
python中多进程与Linux 下的C基本相同. fork的基本使用 先看最简单的例子: # coding: utf-8 import os def my_fork(): pid = os. ...
- <转>C++位运算详解
原文转自:http://www.crazycpp.com/?p=82 前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查 ...
- PHP,mysql,Linux,CI框架学习总结
PHP,mysql,CI框架学习总结 PHP标记 1.Xml风格<?php ?> 2.简短风格 <? ?> 需在php.ini中开启short_open_tag 3.asp风格 ...