深入浅出MFC第2版 92 页有个地方没有看懂。求指点

rainmarker 2010-08-26 04:56:45
BOOL CWnd::CreateEx()
{
cout<<“CWnd::CreateEx \n";
PreCreateWindow();

return TRUE;
}

这个PreCreateWindow(); 为什么 是调用CFrameWnd::PreCreateWindow 而不是调用CWnd::PreCreateWindow();
...全文
211 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainmarker 2010-08-28
  • 打赏
  • 举报
回复
一语道破天机。
rainmarker 2010-08-28
  • 打赏
  • 举报
回复
怎么没有想到THIS了。
百事烟 2010-08-28
  • 打赏
  • 举报
回复
this->PreCreateWindow(); 


this调用的
rainmarker 2010-08-28
  • 打赏
  • 举报
回复
我也知道是虚函数,不知道我那个环节理解错了。
rainmarker 2010-08-28
  • 打赏
  • 举报
回复
没有人来了?
rainmarker 2010-08-27
  • 打赏
  • 举报
回复
这么说来是多态,可是我并没有看到基类指针或引用来调用PreCreateWindow()
nwao7890 2010-08-27
  • 打赏
  • 举报
回复
虚函数啊,虚函数
wl865 2010-08-27
  • 打赏
  • 举报
回复
2楼说的对~
zydzmapx 2010-08-27
  • 打赏
  • 举报
回复
虚函数重载 CFrameWnd::PreCreateWindow
rainmarker 2010-08-27
  • 打赏
  • 举报
回复
都睡了?没有人来了?
jimmy808126 2010-08-26
  • 打赏
  • 举报
回复
呵呵 因为是虚函数嘛 如果不是虚函数 调用的就是CWnd::PreCreateWindow();
其实 如果是虚函数 最主要的 就是看谁调用了CreateEx, 源头是谁就调用谁的PreCreateWindow
rainmarker 2010-08-26
  • 打赏
  • 举报
回复
晚上回去结贴。
rainmarker 2010-08-26
  • 打赏
  • 举报
回复
呵,谢了。
山伟 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jasonm2008 的回复:]
我刚刚看了哈书,给你说说吧,是因为PreCreateWindow 是虚函数,而且CFrameWnd又重写了他,而实例化的是CFrameWnd这个类。所以要调用CFrameWnd这个类的PreCreateWindow 。不知道你懂了没,不懂的话,好好看看虚函数这块!
[/Quote]

这位老兄的解释我很同意!
山伟 2010-08-26
  • 打赏
  • 举报
回复

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
...

return 0;
}

BOOL CWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
// can't use for desktop or pop-up windows (use CreateEx instead)
ASSERT(pParentWnd != NULL);
ASSERT((dwStyle & WS_POPUP) == 0);

return CreateEx(0, lpszClassName, lpszWindowName,
dwStyle | WS_CHILD,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext);
}

BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
...
if (!PreCreateWindow(cs))
{
PostNcDestroy();
return FALSE;
}
...
return TRUE;
}

CWnd的CreateEx都是从子类调上来的,因此只要子类有重写过PreCreateWindow()在CWnd的PreCreateWindow会调用子类的。

清楚来源是哪里
jasonM2008 2010-08-26
  • 打赏
  • 举报
回复
我刚刚看了哈书,给你说说吧,是因为PreCreateWindow 是虚函数,而且CFrameWnd又重写了他,而实例化的是CFrameWnd这个类。所以要调用CFrameWnd这个类的PreCreateWindow 。不知道你懂了没,不懂的话,好好看看虚函数这块!
jasonM2008 2010-08-26
  • 打赏
  • 举报
回复
看他实例化的那个类的,如果是虚函数,那么,实例化的那个类的,就调用那个类的方法,如果那个类没有重写此虚函数,才会调用父类的。如果不是虚函数,那么就要看实例化的是哪个类了,还要看是如何调用的。!
rainmarker 2010-08-26
  • 打赏
  • 举报
回复
class CWnd::public CCmdTarget
{
public:
CWnd::CWnd() {}
~CWnd::CWnd() {}
virtual BOOL Create();
BOOL CreateEx();
virtual BOOL PreCreateWindow();
}
rainmarker 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cpp2017 的回复:]

调用哪个对象的方法,默认就是他自己的,如果他没有继承这个虚函数才会调用父对象的这个方法.
[/Quote]
我也这么认为应该是调用自己的。不知道书怎么调用到子类去了。很郁闷。
rainmarker 2010-08-26
  • 打赏
  • 举报
回复
BOOL CWnd::CreateEx()
{
cout<<“CWnd::CreateEx \n";
PreCreateWindow();

return TRUE;
}


BOOL CFrameWnd::PreCreateWindow()
{
\\details
return TRUE;
}

BOOL CWnd::PreCreateWindow
{
\\details
return TRUE;
}
加载更多回复(5)

16,471

社区成员

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

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

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