本次应用:定义基类成员函数指针数组,并且使用基类成员函数指针初始化该数组,然而,在调用该数组时,使用指向子类对象的父类指针调用,此时,调用的是子类对象的成员函数。
#include <iostream>
//基类
class base
{
public:
virtual void print1(const char* str)
{
std::cout<<"base class print1 func:"<<str<<std::endl;
}
virtual void print2(const char* str)
{
std::cout<<"base class print2 func:"<<str<<std::endl;
}
};
//子类
class son:public base
{
public:
void print1(const char* str)
{
std::cout<<"son class print1 func:"<<str<<std::endl;
}
void print2(const char* str)
{
std::cout<<"son class print2 func:"<<str<<std::endl;
}
};
//定义基类成员函数指针类型
typedef void (base::*FUNC)(const char*);
//typedef void (son::*FUNC)(const char*);//错误
int _tmain(int argc, _TCHAR* argv[])
{
FUNC func[2];//定义指针函数数组
//base* pf=new base();//指向父类对象
base* pf=new son();//指向子类对象
func[0]=&base::print1;
func[1]=&base::print2;
//使用基类指针调用成员函数指针指向的函数
(pf->*func[0])("num 1");
(pf->*func[1])("num 2");
std::cin.get();
return 0;
}
输出结果为:
son class print1 func:num 1
son class print2 func:num 2
可以看出,调用的是子类成员函数.