指向成员函数的指针并非指针

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_数据成员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值