class Shape
{
public:
//....
void moveTo(Point newLocation);
bool validate() const;
virtual bool draw() const = 0;
//...
};
class Circle : public Shape
{
//...
bool draw() const;
//...
};
//...
1、void (Shape::*mf1)(Point) = &Shape::moveTo; //不是指针
2、和指向常规的指针不同,指向成员函数的指针可以指向一个常量成员函数:
bool (Shape::*mf2)() const = &Shape::validate;
3、和指向数据成员的指针的情形一样,为了对一个指向成员函数的指针进行解引用,需要一个对象或一个指向对象的指针。
Circle circ;
Shape *pShape = ˆ
(pShape->*mf2)(); //调用Shape::validate
(circ.*mf2)(); //调用Shape::validate
逆变性:
和指向数据成员的指针一样,指向成员函数的指针也表现出一种逆变性,即存在从指向基类成员函数的指针指向派生类成员函数指针的预定义转换,反之则不然。
class B
{
public:
void best(int val){bval_ = val;}
private
int bval_;
};
class D :public B
{
public:
void dest(int val){dval_ = val;}
private:
int dval_;
}
B b;
D d;
void (B::*f1)(int) = &D::dset; //错误!不存在这种反响的转换
(b.*f1)(l2); //哎呀!访问不存在的dval成员!
void (D::*f2)(int) = &B::bset; //ok ,c存在这种转换
(d.*f2)(l1); //ok,设置继承来的bval_数据成员