关于消息传递时 this指针的问题 MFC高手进

来源:百度知道 编辑:UC知道 时间:2024/05/21 19:12:34
当调用一个函数的时候 实际上传入了一个隐性的this指针参数 来明确到底是调用谁的函数(比如基类有个函数A 派生类重写了函数A 那么一个指向A的指针p, p->A();到底是调用基类的A还是派生类的A 全看this了)

小弟在学习命令传递的时候对this有点不明确
有问题2个:
1:
比如CFrameWnd对象获得一个命令消息,按照MFC的消息传递机制,应该先调用CFrameWnd::OnCommand(),然后CFrameWnd::OnCommand()调用CWin::OnCommand();然后CWin::OnCommand()调用OnCmdMsg();这个时候 请问为什么this指针指向CFrameWnd呢?因为书上说是调用了CFrameWnd::OnCmdMsg();而不是CWnd::OnCmdMsg();这里有点不太明白

2:
CFrameWnd();利用pView->OnCmdMsg();调用了OnCmdMsg(); 这个时候肯定调用的是CView::OncmdMsg();然后CView::OncmdMsg()调用CWnd::OnCmdMsg();因为CWnd没有改写OnCmdMsg();所以是调用了基类CCmdTarget::OnCmdMsg();在CCmdTarget::OnCmdMsg()中调用了GetMessageEntry();问题就在这里 请问调用GetMassageEntry();的时候 请问调用的是哪个类的?这个对看懂程序很重要,也就是问 调用该函数的时候 this是指向谁的?CView?CWnd?还是CCmdTarget?

谢谢高手指教 渴望能一步步的教我下 我会追加100分
对不起 第2个问题第一行开头是CFrameWnd 不是CFrameWnd();

1. 首先,我们必须应该知道CFrameWnd::OnCommand()这个函数是个虚函数,言外之意,一般来说,CFrameWnd的所有基类的OnCommand()函数都不可能被显式的调用了。当然了,在CFrameWnd::OnCommand()函数的内部,又调用了CWnd::OnCommand()函数,其实也就是把系统消息传递给基类CWnd去处理。
你所关心的问题是this指针为什么指向CFrameWnd,其实this指针并没有指向它,而是指向了CMainFrame这个对象,假如你使用的是单文档架构的话。而我们说CMainFrame所生成的对象包含了CFrameWnd对象,而CFrameWnd对象又包含了CWnd对象,所以当this指针指向CMainFrame对象的时候,已经同时指向了它所有的基类。而我们知道OnCmdMsg()函数又是一个虚函数,由于多态的原因,this指针的vptr(虚函数表指针)所指向的CFrameWnd中的所有虚函数,从而此时this指针所能获得的OnCmdMsg()函数的确是属于CFrameWnd类的。
2. 这个问题与1应该说是很相似了,this指针总是指向你所创建的对象本身,并同时指向它所有的基类,而由于运行时多态的存在,其实也就是虚函数的存在,使this指针所能访问到的函数会改变。从而此时的this指针指向你的工程中的CXxxxView对象,而作为CView基类的CCmdTarget类,它的所有成员函数都是属于CXxxxView的,CXxxxView可以随意的访问任意一个非私有的成员函数与变量。

去把重载、覆盖、虚函数看一下这个问题你就知道了