关于深入浅出mfc中frame2示例的问题_百度知道

whypp 2008-12-16 11:22:01
第三章里面《六大关键技术之仿真》frame2范例中,最后调到的是CFrameWnd::PreCreateWindow
而不是CWnd::PreCreateWindow,
据作者解释是因为“第2章的「Object slicing 与虚拟函数」
一节所说提「虚拟函数的一个极重要的行为模式」”,

根据我的理解(也来自第二章),Object slicing是在把派生类对象强制转化成父类使用的时候,编译器会将父类的虚拟表以及成员变量,成员函数复制一份给该派生类对象,使之完全成为一个其父类的对象,通过该对象调的成员函数,都是父类的成员函数。

但是在第三章这个例子里,并不存在子类强制转化为父类使用的情况,而是CFrameWnd继承了父类CWnd的CreateEx()函数,其this指针是指向CFrameWnd类的对象的,所以才调到了CFrameWnd::PreCreateWindow()。

侯老师却说是因为Object slicing,我就糊涂了,高手请解惑。

MFC.H
#define BOOL int
#define TRUE 1
#define FALSE 0

#include <iostream.h>

class CObject
{
public:
CObject::CObject() {
}
CObject::~CObject() {
}
};

class CCmdTarget : public CObject
{
public:
CCmdTarget::CCmdTarget() {
}
CCmdTarget::~CCmdTarget() {
}
};

class CWinThread : public CCmdTarget
{
public:
CWinThread::CWinThread() {
}
CWinThread::~CWinThread() {
}

virtual BOOL InitInstance() {
cout << "CWinThread::InitInstance \n";
return TRUE;
}
virtual int Run() {
cout << "CWinThread::Run \n";
return 1;
}
};

class CWnd;

class CWinApp : public CWinThread
{
public:
CWinApp* m_pCurrentWinApp;
CWnd* m_pMainWnd;

public:
CWinApp::CWinApp() {
m_pCurrentWinApp = this;
}
CWinApp::~CWinApp() {
}

virtual BOOL InitApplication() {
cout << "CWinApp::InitApplication \n";
return TRUE;
}
virtual BOOL InitInstance() {
cout << "CWinApp::InitInstance \n";
return TRUE;
}
virtual int Run() {
cout << "CWinApp::Run \n";
return CWinThread::Run();
}
};


class CDocument : public CCmdTarget
{
public:
CDocument::CDocument() {
}
CDocument::~CDocument() {
}
};


class CWnd : public CCmdTarget
{
public:
CWnd::CWnd() {
}
CWnd::~CWnd() {
}

virtual BOOL Create();
BOOL CreateEx();
virtual BOOL PreCreateWindow();
};

class CFrameWnd : public CWnd
{
public:
CFrameWnd::CFrameWnd() {
}
CFrameWnd::~CFrameWnd() {
}
BOOL Create();
virtual BOOL PreCreateWindow();
};

class CView : public CWnd
{
public:
CView::CView() {
}
CView::~CView() {
}
};


// global function

CWinApp* AfxGetApp();

...全文
65 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
whypp 2008-12-16
  • 打赏
  • 举报
回复
MY.cpp
#include "my.h"

CMyWinApp theApp;

BOOL CMyWinApp::InitInstance()
{
cout << "CMyWinApp::InitInstance \n";
m_pMainWnd = new CMyFrameWnd;
return TRUE;
}

CMyFrameWnd::CMyFrameWnd()
{
cout << "CMyFrameWnd::CMyFrameWnd \n";
Create();
}

//------------------------------------------------------------------
// main
//------------------------------------------------------------------
void main()
{

CWinApp* pApp = AfxGetApp();

pApp->InitApplication();
pApp->InitInstance();
pApp->Run();
}
//------------------------------------------------------------------

whypp 2008-12-16
  • 打赏
  • 举报
回复
MFC.cpp
#include "my.h"  // it should be mfc.h, but for CMyWinApp definition, so...

extern CMyWinApp theApp;

BOOL CWnd::Create()
{
cout << "CWnd::Create \n";
return TRUE;
}

BOOL CWnd::CreateEx()
{
cout << "CWnd::CreateEx \n";
PreCreateWindow();
return TRUE;
}

BOOL CWnd::PreCreateWindow()
{
cout << "CWnd::PreCreateWindow \n";
return TRUE;
}

BOOL CFrameWnd::Create()
{
cout << "CFrameWnd::Create \n";
CreateEx();
return TRUE;
}

BOOL CFrameWnd::PreCreateWindow()
{
cout << "CFrameWnd::PreCreateWindow \n";
return TRUE;
}


CWinApp* AfxGetApp()
{
return theApp.m_pCurrentWinApp;
}
whypp 2008-12-16
  • 打赏
  • 举报
回复
MY.H

#include <iostream.h>
#include "mfc.h"

class CMyWinApp : public CWinApp
{
public:
CMyWinApp::CMyWinApp() {
}
CMyWinApp::~CMyWinApp() {
}

virtual BOOL InitInstance();
};

class CMyFrameWnd : public CFrameWnd
{
public:
CMyFrameWnd();
~CMyFrameWnd() {
}
};


64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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