一个简单的小测试程序(孙鑫VC视频里的)

Stefine 2005-04-20 10:27:06
看过视频的朋友给点意见啦,我可能描述的不太清楚!

一:孙老师说根据继承性原理,这里的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指针就会指向子类的对象?

看过孙老师教程的朋友如果谁早写出来的,麻烦帖出来看看!

先谢了,



...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sungengyu 2005-04-29
  • 打赏
  • 举报
回复

“根据继承性原理,这里的this指针指向派生类的对象”

我想孙鑫的意思是这样的:
此处的基类是 CWinThread ,派生类是 CWinApp。和你的CMyApp没什么关系。

pThreadState->m_pCurrentWinThread = this;

这个pThreadState->m_pCurrentWinThread 的类型是 CWinThread*
this 指针的类型是 CWinApp*



我好像被你这句话误导了:
“部分代码如下:(CWinApp为基类,派生一个CTestApp,并创建一个全局的派生类对象)”

ps : 既然拿了你20分,就要把问题搞清楚!
Stefine 2005-04-27
  • 打赏
  • 举报
回复
对于sungengyu(快乐机器)所讲的我已经完全明白,你举的例子也只能说明在对象尚未完全初始化时,只能调用基类的构造函数!

PS:你的例子也不能说明任何多态性的原理

我这样测试“:
void main()
{
B b;
A *aptr = &b;
aptr->Test1();
}
派生类的内存模型是,先构造基类然后构造派生类。而派生类的this指针指向内存模型中的基类首地址

如果通过指针调用派生类的某个方法时,如果这个方法是虚函数。那么就调用派生类的方法。如果不是虚函数,则会调用基类的方法。

对不?

可我还是无法理解孙老师所说的this指向派生类对象的
这里的this怎么与多态性扯上关系啦

还请高手们帮小弟我看看
sungengyu 2005-04-21
  • 打赏
  • 举报
回复
class A
{
public :
A()
{
this->Test1() ;
this->Test2() ;
}
virtual ~A(){}

virtual void Test1(){ ::MessageBox(0,"A::Test1()","",0) ; }
void Test2(){ ::MessageBox(0,"A::Test2()","",0) ;}
};

class B : public A
{
public :
B(){}
virtual ~B(){}

virtual void Test1(){ ::MessageBox(0,"B::Test1()","",0); }
void Test2(){ ::MessageBox(0,"B::Test2()","",0); }
};

B b ;

即使是对于虚函数,在基类的构造函数中被调用的,也一样是基类的虚函数而不是派生类的虚函数。
这是因为构造函数中,对象尚未完全初始化,如果调用的是派生类的虚函数,恐怕会有未预期的结果(因为派生类会在调用自己的构造函数前,先调用基类的构造函数,此时派生类中所有的变量都未初始化)
暗黑帝国 2005-04-21
  • 打赏
  • 举报
回复
如果在子类里的this当然是指向子类了,子类里重载了这个函数,父类里的pThreadState->m_pCurrentWinThread这个成员变量也被继承了,并且被子类赋了值,指向了子类,所以这个就是指向子类的
sungengyu 2005-04-21
  • 打赏
  • 举报
回复
我怎么觉得这个 this 指向的是 CWinApp 。
Stefine 2005-04-21
  • 打赏
  • 举报
回复
咋就没有人回

老鸟们帮帮忙啦
sungengyu 2005-04-21
  • 打赏
  • 举报
回复
去看侯捷的《深入浅出MFC》

如果是C++方面的问题,可以看

Bjarne Stroustrup 的《C++ 程序设计语言》 和
Lippman 的《C++ Primer》
sungengyu 2005-04-21
  • 打赏
  • 举报
回复
cheeralen(伤心巨蟹) :

注意 :

(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;
}

这可是父类的构造函数,你能重载父类的构造函数???

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧