以前问的那个帖子是这么发的:
楼主Stefine(太浮躁了,难怪进步如此慢,改变ing)2005-04-20 22:27:06 在 VC/MFC / 基础类 提问
看过视频的朋友给点意见啦,我可能描述的不太清楚!
一:孙老师说根据继承性原理,这里的this指针指向派生类的对象,
部分代码如下:(CWinApp为基类,派生一个CTestApp,并创建一个全局的派生类对象)
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
}
我的疑问是不知道这个this是如何与派生类关联的(在我看来好像毫无关系),怎么就会指向派生类的对象?
二:孙老师要我们自己做一个小测试程序:定义一个基类派生一个子类,了类实例化一个全局对象,在基类的构造函数里把this赋给基类的对象指针,在入口函数里调用基类与子类都定义好的一个函数看输出结果就能证明this指向谁了!
我想:如果定义的函数名一样的话子类的函数肯定会覆盖基类的啊,那还怎么证明?
最主要的困惑是对这个程序测试的原理不大明白,为会么this指针就会指向子类的对象?
看过孙老师教程的朋友如果谁早写出来的,麻烦帖出来看看!
先谢了,
楼主Stefine(太浮躁了,难怪进步如此慢,改变ing)2005-04-20 22:27:06 在 VC/MFC / 基础类 提问
看过视频的朋友给点意见啦,我可能描述的不太清楚!
一:孙老师说根据继承性原理,这里的this指针指向派生类的对象,
部分代码如下:(CWinApp为基类,派生一个CTestApp,并创建一个全局的派生类对象)
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
}
我的疑问是不知道这个this是如何与派生类关联的(在我看来好像毫无关系),怎么就会指向派生类的对象?
二:孙老师要我们自己做一个小测试程序:定义一个基类派生一个子类,了类实例化一个全局对象,在基类的构造函数里把this赋给基类的对象指针,在入口函数里调用基类与子类都定义好的一个函数看输出结果就能证明this指向谁了!
我想:如果定义的函数名一样的话子类的函数肯定会覆盖基类的啊,那还怎么证明?
最主要的困惑是对这个程序测试的原理不大明白,为会么this指针就会指向子类的对象?
看过孙老师教程的朋友如果谁早写出来的,麻烦帖出来看看!
先谢了,
类对象的内存布局是 基类数据+子类特别数据. 子类中包含有基类的数据! 所以,这里的this指针,在语法上是指向基类的,但因为实际对象是个子类对象,也可以理解为子类指针,有点类似于union.
{
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
}
这里的this代表的是CWinApp,m_pCurrentWinThread一定是个CWinApp类或子类,这样的操作完全是个地址操作,以后m_pCurrentWinThread就代表CWinApp类
//关于this指针;
//注意:this指针指向的是类的对象,也就是当前实例化的对象.如果实例化是子类,则反回来的是子类的指针
//如果实例化的是父类,则返回的是父类的指针.
#include <iostream.h>class Base
{
public:
Base *pB;public:
Base()
{
pB = this;
}
virtual void output()//定义虚函数,是为了在运行时判断传入对象的指针类型
{
cout<<"Output Base!"<<endl;
}
};class Derive : public Base
{
public:
void output()
{
cout<<"Output Derive!"<<endl;
}
};Derive de;//如果实例化的是子类,则返回的是子类的指针
//Base de;//如果实例化的是父类,则返回的是父类的指针.void main()
{
de.pB->output();
}