打印

指针问题

[复制链接]
1017|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yybj|  楼主 | 2012-4-21 19:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假如有这样一个类
class B:{
public:
   
void fun(void){cout<<'3'<<endl;}
   
void fun2(void){cout<<'4'<<endl;}
};

只有两个成员函数的类B。

B *p = new B;

这句话的意思是 申请B型内存空间,并将空间首地址赋给p。

那么是不是就可以 用 p->fun()调用成员函数了, 而这个和 this->fun()是不是一样。

也可以理解为 p == this ?

问题源自于这样一段代码
class A{
public:     virtual
void fun(void){cout <<
'1'
<< endl;}
   
virtual
void fun2(void){cout <<
'2'
<< endl;}
};
class B:public A{
public:
   
void fun(void){cout<<'3'<<endl;}
   
void fun2(void){cout<<'4'<<endl;}
};
int main()
{
   
void (*fun)(A*);//设置函数指针fun,参数类型为 指向A型对象的指针
    A *p=new B;//申请B型对象空间,并把这个内存单元的地址保存在p中

long lVptrAddr;//定义长整形变量,一会用来保存一个4字节的地址
    memcpy(&lVptrAddr,p,4);//
    memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4);
    fun(p);
    delete p;
    system(
"pause");
}


memcpy(&lVptrAddr,p,4);// p指向地址为首地址,依次读取4个字节,并将这4个字节的内容放在&lVptrAddr为首地址的内存空间中去,就完成了对long lVptrAddr的赋值。

通过单步运行发现,lVptrAddr的值就是 p 指向的 _vfptr的值。..试问 这个_vfptr 就是 B对象的this么?
_vfptr 下 两个函数 B::fun() B::fun2()

相关帖子

沙发
txcy| | 2012-4-21 19:54 | 只看该作者
LZ可以搜一下虚函数表。

使用特权

评论回复
板凳
火箭球迷| | 2012-4-21 20:03 | 只看该作者
long lVptrAddr;//定义长整形变量,一会用来保存一个4字节的地址
  memcpy(&lVptrAddr,p,4);//
  memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4);
感觉这是说虚函数表的机理,p的地址实际上就是虚函数表的地址;
在有虚函数的类生成的对象,这个对象的地址,就是虚函数表的地址。
虚函数表里,则存放着虚函数的地址(即虚函数名)。
通过函数指针则可访问虚函数。

使用特权

评论回复
地板
baidudz| | 2012-4-22 19:33 | 只看该作者
找本C++的书,看看虚函数表

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

2496

帖子

1

粉丝