#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");
}