请教一个通过定义一个类的成员函数指针类型,通过虚函数的地址来调用到具体的实例的问题
最近写了怎么一个程序,看起来是没有问题,可以通过虚函数的地址来调用到具体的实例,但是就是有点不太明白?代码如下:
class A
{
public:
typedef void(A::*FUNC)();
public:
virtual void fun1()
{
cout<<"Afun1";
}
virtual void fun2(){}
void Reg()
{
m_FunMgr.insert(map<int, FUNC>::value_type (1,&A::fun1));
m_FunMgr.insert(map<int, FUNC>::value_type (2,&A::fun2));
}
FUNC FindFun(int i)
{
map<int, FUNC>::iterator iter;
iter = m_FunMgr.find(i);
FUNC pFun = (FUNC)iter->second;
return pFun;
}
private:
map<int,FUNC> m_FunMgr;
};
class B :public A
{
public:
void fun1()
{cout<<"BFUN1";}
void fun2()
{cout<<"BFUN2";}
};
int main()
{
A *a = new B;
a->Reg();
A::FUNC fun;
fun = a->FindFun(1);
(a->*(fun))(); //调用的是B的func 这里为啥调用的是子类的
return 0;
}
其实在这里里面存放的虚函数的地址好像是基类的地址,而且这个地址一直都没有 变过。
难道这里存放的不是虚函数的地址,而是一个索引?根据这个索引找到相关的实例指针?
这个真的是不明白了,请大侠指教,多谢~