类成员函数指针

原创 2013年12月02日 19:46:03
#include <iostream>
using namespace std;
class human //抽象类human
{
   public:
   virtual void run()=0; //纯虚函数run
   virtual void eat()=0; //纯虚函数eat
};
class mother:public human //派生类mother从抽象类human继承
{
   public:
   void run(){cout<<"母亲跑百米要花二十秒\n";} //覆盖纯虚函数run
   void eat(){cout<<"母亲喜欢吃零食\n";} //覆盖纯虚函数eat
};
class father: public human //派生类father从抽象类human继承
{
   public:
   void run(){cout<<"父亲跑百米要花十秒\n";} //覆盖纯虚函数run
   void eat(){cout<<"父亲不喜欢吃零食\n";} //覆盖纯虚函数eat
};
class uncle:public human //派生类uncle从抽象类human继承
{
   public:
   void run(){cout<<"舅舅跑百米要花十一秒\n";} //覆盖纯虚函数run
   void eat(){cout<<"舅舅喜欢偷吃零食\n";} //覆盖纯虚函数eat
};
int main()
{
   void(human::*pf)()=0; //声明一个成员函数指针pf,该指针属于抽象类human
   human*p=0; //声明一个指向抽象类human的指针p,并将它的内存地址赋为0
   char choice1,choice2; //声明两个字符变量,用来保存两次用户输入的字符
   bool quit=false; //声明一个布尔变量quit作为while循环的条件
   while(quit==false) //当quit为真时退出循环
   {
      cout<<"(0)退出(1)母亲(2)父亲(3)舅舅:"; //选择菜单
      cin>>choice1; //将用户的第1次选择保存在choice1中
      switch(choice1) //将该选择作为判断的依据
      {
         case '0':quit=true;break; //假如输入了字符0,那么将quit的值赋为真,然后退出switch循环
         case '1':p=new mother;break; //假如输入了字符1,那么创建mother类的新对象,并将p指向它,然后退出switch循环
         case '2':p=new father;break; //假如输入了字符2,那么创建father类的新对象,并将p指向它,然后退出switch循环
         case '3':p=new uncle;break; //假如输入了字符3,那么创建uncle类的新对象,并将p指向它,然后退出switch循环
         default:choice1='q';break; //将字符q赋给choice1,然后退出switch循环
      }
   if(quit) //假如quit的值为真
   break; //退出while循环
   if(choice1=='q') //假如choice1的值为字符q
      {cout<<"请输入0到3之间的数字\n";continue;} //输出警告并跳转到while循环的开始处继续执行
   cout<<"(1)跑步(2)进食\n"; //输出选择菜单
   cin>>choice2;   //将第2次用户的选择保存在choice2中
   switch(choice2) //将用户的第2次选择作为判断的依据
   {
      case '1':pf=&human::run;break; //假如输入了字符1,那么将基类human的虚函数run的内存地址赋给成员函数指针,然后退出switch循环。注意,这里的&号是取human类成员函数run的地址
      case '2':pf=&human::eat;break; //假如输入了字符2,那么将基类human的虚函数eat的内存地址赋给成员函数指针,然后退出switch循环
      default:break; //退出switch循环
   }
    (p->*pf)(); //通过指针p来访问对象,通过*pf来访问该对象的成员函数
   delete p; //删除p指针,因为*pf指向的不是对象而是该对象的成员函数,所以没有必要删除pf
   }
   return 0;
}

如何声明类成员函数指针?

比如: 有如下的一个类, 里面有一个成员函数 Func() class Test {      public:       int Func(void* param1, void* param2); ...
  • sunny04
  • sunny04
  • 2014年01月21日 15:28
  • 923

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

原文:http://www.vckbase.com/document/viewdoc/?id=1818一、成员函数指针的用法  在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以...
  • lqk1985
  • lqk1985
  • 2008年05月08日 19:18
  • 3524

如何使用指向类的成员函数的指针(详解!)

我们首先复习一下"指向函数的指针"如何使用?   void print()   {   }   void (*pfun)(); //声明一个指向函数的指针,函数的参数是 void,函数的返回值是 vo...
  • lishuhuakai
  • lishuhuakai
  • 2014年01月14日 22:13
  • 27144

C++如何声明类成员函数指针或类成员变量指针(A::*)

例如有如下类,class A { int mem; int* func(void) { //... } };怎么声明类A的成员函数指针或成员变量指针呢?...
  • yockie
  • yockie
  • 2016年06月30日 01:23
  • 2389

C++关于类成员函数指针的正确写法

关于类成员函数指针的正确写法 10-09 Web开发 Dante 10,735 一般来说,函数指针的用法是比较简单的。 比如对于函数: int innerFunc(i...
  • a511244213
  • a511244213
  • 2015年05月26日 16:02
  • 1351

c++ 全局函数指针和类成员函数指针

c++非类成员函数指针定义 void (*pfun
  • my_friend_ship
  • my_friend_ship
  • 2014年11月22日 16:36
  • 547

【解惑】函数名与函数指针(普通C/C++函数、C++类*静态*函数名取不取址都一样,但C++类成员函数必须取址)

【解惑】函数名与函数指针    今天在学习linux下c程序设计时,看到函数指针时,在书上看到一个例子如下: 1 int get_max(int i, int j, int k, int...
  • love_hot_girl
  • love_hot_girl
  • 2013年10月15日 16:19
  • 718

函数指针,成员函数指针,重载函数指针

指向函数的指针 函数的类型由它的返回值和参数列表决定, 但函数不能返回一个函数类型。 01 int fce( const char*, ... ); ...
  • ttomqq
  • ttomqq
  • 2014年05月30日 16:04
  • 816

类的成员函数指针,类的静态成员函数指针

/* * File: main.cpp * Author: Vicky.H * */ #include void f1() { std::cout
  • eclipser1987
  • eclipser1987
  • 2012年08月31日 17:56
  • 2162

类的成员函数指针的使用方法

函数指针主要的目的是实现与运用相互分离,类的成员函数封装在类里面,运行需要相应的对象来调用,所以在调用这个类的成员函数时候,需要类的函数地址和这个类的对象。     以下是实现的类:     cl...
  • software047
  • software047
  • 2017年01月20日 10:09
  • 402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类成员函数指针
举报原因:
原因补充:

(最多只允许输入30个字)