一、指向成员函数的指针
class A
{
public:
void myfunc1(int nTempValue)
{
cout << "nTempValue = " << nTempValue << endl;
}
void myfunc2(int nTempValue2)
{
cout << "nTempValue2 = " << nTempValue2 << endl;
}
};
void func()
{
A mya;
void(A::*pMypoint)(int n) = &A::myfunc1;
//通过成员函数指针来调用成员函数,必须要通过对象的介入才能调用
(mya.*pMypoint)(100);
//用对象的指针来调用成员函数指针
A *pMya = new A;
(pMya->*pMypoint)(1000);
/*
编译器视角:
pMypoint(pMya,1000)
*/
}
void main()
{
func();
system("pause");
}
结果:
类中的成员函数都是在编译的时候就确定好的,但是在调用的时候是需要通过对象来调用成员函数的,因为成员函数的运行依赖于一个this指针,这个this指针其实就是对象的首地址。其实所有这种常规的(非静态)的成员函数,要想调用,都需要一个对象来调用它。
接下来往类中增加一个静态成员函数,
class A
{
public:
void myfunc1(int nTempValue)
{
cout << "nTempValue = " << nTempValue << endl;
}
void myfunc2(int nTempValue2)
{
cout << "nTempValue2 = " << nTempValue2 << endl;
}
static void mySfunc(int nsTempvalue)
{
cout << "A:mySfucn() 静态成员函数:" << nsTempvalue << endl;
}
};
void func()
{
A mya;
void(A::*pMypoint)(int n) = &A::myfunc1;
//通过成员函数指针来调用成员函数,必须要通过对象的介入才能调用
(mya.*pMypoint)(100);
//用对象的指针来调用成员函数指针
A *pMya = new A;
(pMya->*pMypoint)(1000);
/*
编译器视角:
pMypoint(pMya,1000)
*/
//静态
void(*pfuncs)(int a) = &A::mySfunc;
pfuncs(101);
}
结果:
因为静态成员函数是跟着类走的,编译器不会向静态成员函数中插入this指针作为第一个参数。所以可以使用函数指针调用静态成员函数。
二、指向虚成员函数的指针
向类中加入如下函数
virtual void myvirfunc(int ntempvalue)
{
cout << "myvirfunc是虚函数,ntempvalue = " << ntempvalue << endl;
}
使用成员函数指针来接虚函数。因为虚函数的执行需要this指针
调用:
//用对象的指针来调用成员函数指针
A *pMya = new A;
(pMya->*pMypoint)(1000);
void(A::*pmyvirfu)(int nn) = &A::myvirfunc;
(pMya->*pmyvirfu)(10086);
那通过成员函数指针接过来的虚函数走的是普通函数的调用,还是走的虚函数表的调用呢?
其实是走的虚函数表(多态的调用方式)