关于类的指针的问题。
假如有这样一个类
- 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");
}
[解决办法]