mfc深入浅出问题
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; //***(1)
}
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();
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;
}
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() {
}
};
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(); //***(2)
pApp->InitApplication();
pApp->InitInstance();
pApp->Run();
}
//------------------------------------------------------------------
我的问题是:
(2)处的返回的指针是指向 CWinApp 还是 CMyWinApp
还有 CWinApp* m_pCurrentWinapp;可以被CMyWinApp继承,但构造函数
CWinApp::CWinApp() {
m_pCurrentWinApp = this;
}
能被CMyWinApp继承吗?
问题点数:100、回复次数:10Top
1 楼webber84(***闭关修炼中***)回复于 2002-07-07 20:48:41 得分 5
1:应该是指向CWinApp的;
2:构造函数不会被继承,但子类的构造函数会自动调用父类的构造函数。Top
2 楼sunHarbin()回复于 2002-07-08 09:31:18 得分 0
pApp->InitApplication();
pApp->InitInstance(); 怎么调用BOOL CMyWinApp::InitInstance()
pApp->Run();
Top
3 楼renren6250(刀客)回复于 2002-07-08 09:53:14 得分 5
1:应该是指向theApp的;
AfxGetApp就是取得theApp的对象指针.使pApp指向这个对象指针.
theApp是CMyWinApp的对象,当然调用了BOOL CMyWinApp::InitInstance()
Top
4 楼nuaawyd(血影狂刀)回复于 2002-07-08 10:00:17 得分 0
我觉得第一个问题 renren6250(刀客) 的对
webber84(糕鱼昏) 不对,而他的第二个回答是对的Top
5 楼lahlili()回复于 2002-07-08 11:09:43 得分 5
1.(2)处应该返回theApp对象,即CMyWinApp的实例。使用父类的指针类型,但指向的是子类对象。正是C++多态的运用。
2.第二个问题webber84(糕鱼昏)说的是对的Top
6 楼sunHarbin()回复于 2002-07-09 07:58:04 得分 0
to lahlili()
CWinApp::CWinApp() {
m_pCurrentWinApp = this;
}
在调用CWinApp的构造函数时,m_pCurrentWinApp 是CWinApp对象,m_pCurrentWinApp 以后再没有被重新赋值,何以是CMyWinApp实例。
我好糊涂!!!!
Top
7 楼virtualmfc(scale)回复于 2002-07-09 08:12:12 得分 85
其实这些都不对,只要大家从C++的对象模型上来考虑,就知道。由于内存布局的原因。父类的this指针就是子类的this指针。这是因为在内存中,首先是存放父类对象的。台湾的高焕堂先生在其《架构设计》一书中曾形象地比喻说是“母子同体”。Top
8 楼sunHarbin()回复于 2002-07-09 18:47:23 得分 0
我还是不十分明白
virtualmfc(scale) 《架构设计》有电子版,能否给我一份。
我email: sunnf@wan-bo.com
Top
9 楼virtualmfc(scale)回复于 2002-07-10 11:07:33 得分 0
上UMLChina上找吧。Top




