读书人

this 指针的有关问题

发布时间: 2013-07-04 11:45:33 作者: rapoo

this 指针的问题



按继承性原理应该是
aaa
bb
求解
[解决办法]
B类构造函数中会默认调用A类的默认构造函数来构造A类子对象。。也就是B类的构造函数可以看成

B():A()
{
}

而这个output是在A()中调用的,所以this的静态类型为A *const,而output又不是虚函数,所以调用的就是A::output。。
不过,就算output加上virtual,调用的还是A类版本。。因为在构造函数中调用虚函数调用的一定是基类版本。。
[解决办法]
建议楼主先学习一下虚函数和多态性。
[解决办法]
B b;构造对象b时候,根据继承性原理,先执行基类构造函数,此时对象未构造完成,只是基类部分构造完成了,所以this调用基类的方法;
如果整个对象都构造完成了,而且基类A的Out函数前有virtual关键字,且是
A* p = new B; p->Out(); 这样才可以实现多态方式
[解决办法]
this表示当前类的实例的指针,也就是说你 this 在哪个类里,这里 this 就指向哪个类。例如当 this 写在 A类的函数里, this 指针就指向 A的实例;每个函数都隐藏着一个this指针,已经定义且初始化,所以不用定义不用初始化就能用,就是这个原因。所以你输出的结果是正确的。
[解决办法]
首先output不是virtual;
其次请参考《Effective C++》条目“不要在构造函数和析构函数中调用虚函数”,讲得比较明白。
[解决办法]
vitual就对了。
[解决办法]
#include <iostream.h>
#include <stdio.h>

class A
{
public:
A()
{
cout<<"A()"<<endl;
this->output(); // 这个this 为什么不是调用子类的output()方法
}
void output()
{
cout<<"a.output()"<<endl;
}
~A(){
cout <<"~A" << endl;
}
};

class B:public A
{
public:
B()
{


cout << "B()" << endl;
}
~B(){
cout << "~B" << endl;
}
void output()
{
cout<< "b.output()" <<endl;
}
};

//B b;
void main()
{
B b;
cout << "********b.output()********" <<endl;
b.output();

}


把你代码稍微改了一下,方便阅读
你的功能只是对 构造,析构调用的顺序问题而已
完全没有涉及到多态
如果想用多态,
1,virtual
2,* or &
[解决办法]
如果想使用多态实现,可以参考
http://blog.csdn.net/dw903632958/article/details/8872559
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]
引用:
B b;构造对象b时候,根据继承性原理,先执行基类构造函数,此时对象未构造完成,只是基类部分构造完成了,所以this调用基类的方法;
如果整个对象都构造完成了,而且基类A的Out函数前有virtual关键字,且是
A* p = new B; p->Out(); 这样才可以实现多态方式


从实现的角度考虑,构造完成的对象,vtable,vptr 才是正确的,才能调用虚函数表里的虚函数;
非虚函数,和对象无关,和类有关,编译器直接安排相关类的函数调用。
虚函数的调用,是安排在对象内部的,通过对象内部安排好的指针,找到要调用的虚函数指针,调用虚函数。
构造函数里对象正在构造,通过对象没有办法,找到虚函数指针,于是编译器就不嗦了,直接按照非虚函数的调用来安排了。

读书人网 >C++

热点推荐