this指针的迷惑。
子类A的成员函数调用父类B的一个方法。显示调用:B::fun(),fun方法里用到了this指针。请问,这个this指针是指向谁?
[解决办法]
子类A
[解决办法]
[解决办法]
关于this指针的一个经典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身
[解决办法]
[解决办法]
[解决办法]
派生类的指针可以转换成基类的指针.
当你使用一个基类的函数或数据成员时,发生这一个转换.
[解决办法]
this 就是本身
当前什么是什么对象this就是什么
this 默认的类型就是当前类本身的一个const指针
- C/C++ code
CurClass *const this;
[解决办法]
子类继承父类也就是子类将父类的成员方法拷贝了一份到自己中,如果子类与父类有相同的方法的时候,用this指针调用的时候会调用子类的成员方法,如果子类与父类没有相同的方法的时候,那么this就会调用父类的那个方法:eg:
#include <iostream>
using namespace std;
//父类A
class A{
public:
void exportA{
cout<<"This is A"<<endl;
}
};
//子类B继承父类A
class B:public A{
public:
void exportB{
cout<<"This is B"<<endl;
}
};
int main()
{
B b;
b.exportB();
}
这个例子中子类B继承了父类A 那么子类B中的代码可以等效为:
class B{
public:
void exportA{
cout<<"This is A"<<endl;
}
void exportB{
cout<<"This is B"<<endl;
}
}这样就实现了代码的重用也就是继承的根本意义。那么this指向这个问题自然而然也就弄明白了:如果子类与父类有相同的方法的时候,用this指针调用的时候会调用子类的成员方法,如果子类与父类没有相同的方法的时候,那么this就会调用父类的那个方法。
[解决办法]
- C/C++ code
#include <iostream>class Base{public: void run() { this->what(); } void what() { printf("I am Base\r\n"); } virtual void vrun() { this->what(); }};class B: public Base{public: void run() { this->what(); } void what() { printf("I am B\r\n"); } virtual void vrun() { this->what(); }};void run(Base *pa){ pa->run();//输出是I am Base。 pa->vrun();//输出是I am B。};void main(){ B b; b.run();//输出是I am B。 run(&b); system("pause");}
[解决办法]
就简单的单继承来说,指向子类。之所以在父类中可以正常使用,是因为父类数据在头部,继承类数据在其后。建议你看看那本经典的 《深入探索C++对象模型》
[解决办法]
[解决办法]
太扯了。
编码的时候,脱离了类的实现this就不能用了,你在实现哪个类的成员函数的时候使用了this,this就代表这个类的一个对象的指针。
楼主的问题
this是在实现父类B的成员函数时候使用到的,所以当执行的时候this指针
从【型】上来说是代表父类的一个对象的指针
从【地址】上来说是指向子类A的一个实例的首地址!
如果还不明白建议楼主从C++类的对象的内存结构入手学习!
[解决办法]
换个角度来说,
this指针只有你在编码时候才会考虑到我用这个this代表谁
就像楼主的例子,既然你在实现类B的时候使用了this,你肯定很明白你在这里用this就是为了运行时来代表类B的一个对象的指针。
在实现类A的成员函数的时候你根本没有用到this指针,而只是间接的使用了B的一个成员函数,这个成员函数总使用了this,但是B使用的this在你实现A的时候跟你已经没有任何关系了!
你根本没必要去考虑B里面的this到底代表谁!
试想如果B不是你实现的,而是别人实现的,并且你看不到如何实现的只知道怎么使用,那你还会关心他里面的this代表谁么?
这个说的是【封装】
也可能楼主把this只当作一个了。
每个类都有自己的this,并且只限定于在这个类的成员函数的实现中。
[解决办法]
学习总结如下:
(1)派生类的指针可以转换成基类的指针.当你使用一个基类的函数或数据成员时,发生这一个转换.
【引用15楼】
(2)this是一个指针,它时时刻刻指向你这个实例本身。 【引用18楼】
(3)类是定义,类是属性,类不是具体存在的“物体”,而是“物体”所属的“类别”【引用31楼】
(4)写this,语义是调用虚函数。如果你不写成虚,那么就没有用。 【应用57楼】
(5)this指针只有你在编码时候才会考虑到我用这个this代表谁 【引用48楼】
其中(1)和(5)是统一的,讲的是一回事!!!!!!!!!!!!
(1)偏重于写程序(windows 程序)
(5) 偏重于读程序(MFC程序)
this指针自总结
(1)this是实例对象的指针,指向子类的首地址(在继承且含虚函数时可很好验证)
(2)编译器编译就近原则(36.38.48楼同)