函数指针实现多态

#include<iostream>

using namespace std;

class CFather;//前向声明

typedef void (CFather::*PFUN_FATHER)();//定义一个  父类成员函数指针

class CFather
{
 public:
  PFUN_FATHER *v_ptr;//指向表的指针
  static PFUN_FATHER v_table[];//虚函数列表  在创建对象前就存在   为静态
  public :
   CFather():v_ptr(CFather::v_table)//构造函数   给指针赋值  只想自己的表
 {
 }
  public :
   void AA()//virtual
 {
  cout<<"CFather::AA"<<endl;
 }
 void BB()//virtual
 {
  cout<<"CFather::BB"<<endl;
 }
 void CC()//virtual
 {
  cout<<"CFather::CC"<<endl;
 }
};

PFUN_FATHER CFather::v_table[]={&CFather::AA,&CFather::BB,&CFather::CC};
//静态函数在类外初始化

 

class CSon:public CFather//公有继承
{
 public :
  static PFUN_FATHER v_table[];//CSon   要有自己的  虚函数列表
 public:
  CSon()
 {
  v_ptr=CSon::v_table;//构造函数   指针赋值   只想自己的表
 }
 public:
 void AA()//virtual
 {
  cout<<"CSon::AA"<<endl;
 }
 void BB()//virtual
 {
  cout<<"CSon::BB"<<endl;
 }
 void DD()//virtual
 {
  cout<<"CSon::DD"<<endl;
 }
};

PFUN_FATHER CSon::v_table[]={(PFUN_FATHER)&CSon::AA,(PFUN_FATHER)&CSon::BB,(PFUN_FATHER)&CFather::CC,(PFUN_FATHER)&CSon::DD};
//注意要将子类函数要覆盖的   进行  强制类型转换   否则无法用父类指针调用函数 

//  父类的虚函数要继承下来  


void main()
{
 CFather *fa=new CSon;//定义对象    指针指向表
 (fa->*(fa->v_ptr[2]))();//  使用成员函数  要用对象  调用成员函数指针
 CFather fb;
 (fb.*(fb.v_ptr[2]))();
 system("pause");
}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值