王朝网络
分享
 
 
 

Item 16. 指向成员函数的指针

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

Item 16. Pointers to Member Functions Are Not Pointers

Pointers to Member Functions :指向成员函数的指针

在此,成员函数指的是非静态的成员函数。

Pointers to state Member Functions Are Pointers

----------------------------------------------------

1、定义

class Shape {

public:

//...

void moveTo( Point newLocation );

bool validate() const;

virtual bool draw() const = 0;

//...

};

class Circle : public Shape {

//...

bool draw() const;

//...

};

//...

void (Shape::*mf1)( Point ) = &Shape::moveTo; //指向成员函数的指针

bool (Shape::*mf2)() const = &Shape::validate;//指向成员函数的指针

比较一下就可以发现,指向成员函数的指针的声明与其所要指向的成员函数的声明是一致的,

无论是返回类型,参数,还是const属性。

2、含义

这一点与类数据成员的指针是一致的,是一个偏移量

3、使用

同指向类数据成员的指针使用方法一样,指向成员函数的指针也需要一个具体的对象的地址,然后加上偏移量,才能够得到对应的成员函数:

Circle circ;

Shape *pShape = ˆ

(pShape->*mf2)(); // call Shape::validate

(circ.*mf2)(); // call Shape::validate

看着那一对一对的括号,是否感觉到眼花缭乱了呢?那都得怪罪"->*"和".*"的优先级没有"()"的高。

4、当虚成员函数出现时:

由于“虚”只是成员函数本身的一个属性,所以就没有指向成员函数的虚指针,因此就有如下:

mf2 = &Shape::draw; // draw is virtual

(pShape->*mf2)(); // call Circle::draw

可以这样理解:pShape指向Circle类的对象circ,所以(pShape->*mf2)()就调用Circle::draw,尽管

mf2赋的值是父类Shape的虚成员函数。

这在内部是如何实现的呢?

指向成员函数的指针保存了如下信息:

1)它指向的成员函数是否为虚的

2)虚函数表的人口点

3)相对于函数的this指针的偏移量(或加或减)

有了以上信息,就可以调用pShape所指向的对象的虚函数了。

5、当继承出现时:

还是那句话:子类有的父类未必有。

class B {

public:

void bset( int val ) { bval_ = val; }

private

int bval_;

};

class D : public B {

public:

void dset( int val ) { dval_ = val; }

private:

int dval_;

};

B b;

D d;

void (B::*f1)(int) = &D::dset; // error!

(b.*f1)(12); // 不合法

void (D::*f2)(int) = &B::bset; // OK

(d.*f2)(11); // OK

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有