父类指针访问子类的成员函数指针

貌似C++中的成员函数指针是没有多态性的,也就是说不能进行下面的赋值:


class base{

};


class test:public base{

public:

int SayHello(int n){

cout<<"hello world"<<n<<endl;

}

};



int main(void){

int (base::*bp)(int) = &test::SayHello;//貌似c++中的成员函数指针没有多态性,这条赋值语句是错误的

return 0;

}


但是如果要实现用父类的指针去调用之类的成员函数指针怎么办呢,可以用下面的方法:


typedef int(*Ptr)(void* ob,int);

int main(void){

 

void* p =(void*)(&test::SayHello);

Ptr bp = (Ptr)p;

test t;

base* p = &t;

bp(p,1);

return 0;

}


也许大家会奇怪为什么会用到typedef int(*Ptr)(void* ob,int); 吧...这就要说到在C++中对象是如何 去调用类中的成员函数的,其实在C++中类的成员函数是不占对象的空间的,

也就是说类的成员函数是外部的,当用于调用类的成员函数时,会把自己的this指针也一并传过去.如下:

//

test t;

t.SayHello(1);//实际上是执行了 SayHello(&t,1);所以这也是为什么我们将成员函数指针最终转化为了 int (*Ptr)(void*ob,int);第一个参数相当与this指针












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值