读书人

关于类的指针的有关问题

发布时间: 2012-04-24 14:15:38 作者: rapoo

关于类的指针的问题。
假如有这样一个类

C/C++ code
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 ?

问题源自于这样一段代码
C/C++ code
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()



[解决办法]
long lVptrAddr;//定义长整形变量,一会用来保存一个4字节的地址
memcpy(&lVptrAddr,p,4);//
memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4);
感觉这是说虚函数表的机理,p的地址实际上就是虚函数表的地址;
在有虚函数的类生成的对象,这个对象的地址,就是虚函数表的地址。
虚函数表里,则存放着虚函数的地址(即虚函数名)。
通过函数指针则可访问虚函数。
大概记得这么多,应该没错吧。LZ可以搜一下虚函数表。
[解决办法]
p的值等于this的值。
加一个成员函数
class B
{
public:
const B* getthis()const
{
return this;
}
};
然后 B *p = new B;
if(p==p->getthis())
{
puts("equal");
}

[解决办法]
探讨

还有一个问题

fun(p);
函数指针 为什么不是 (*fun)(p)

另外fun 指向的是 B::fun(),无参数函数 怎么带上的 指针做参。..


哎。。。..

读书人网 >C++

热点推荐