顾名思义,成员函数指针就是一个指向类的成员函数的指针,那么它与普通的函数指针有什么
不同呢?首先他们都是指向函数的指针只不过成员函数指针指向的是成员函数。在声明的时候需要
所属类名和(::)作用域运算符:
void (ClassName::*pFunc) (int, int);
还有就是在使用的时候需要通过相应类的对象来调用。
class Mammal
{public:
Mammal():itsAge(1) { cout << "Mammal constructor..."n"; }
virtual ~Mammal() { cout << "Mammal destructor..."n"; }
virtual void Speak() const = 0;
virtual void Move() const = 0;
protected:
int itsAge;
};
class Dog:public Mammal
{
public:
void Speak() const { cout << "Woof!" << endl; }
void Move() const { cout << "Walking to heel..." << endl; }
};
int main()
{
void (Mammal::*pFunc) () const = 0; // 声明一个成员函数指针
Mammal * ptr = 0; // 类指针
ptr = new Dog; // 实例化一个类
pFunc = Mammal::Speak; // 把Speak()函数的函数指针赋给pFunc
(ptr->*pFunc)(); // 调用这个成员函数指针
delete ptr;
return 0;
}
上面 pFunc = Mammal::Speak;这句话不同的编译器编译结果不同,有的编译器能通过vc6,有的要报错vs2005
这个原因我想可能是编译器的编译机制导致的。在编译报错的编译器要这样写:
pFunc = &Mammal::Speak;
前面加上一个&运算符,可能在编译前编译器不知道这个到底是个成员函数还是成员变量,所以要告诉编译器这是一
个函数指针,而不成员变量。