关于MFC中AfxGetApp()函数的返回值的疑问!

来源:百度知道 编辑:UC知道 时间:2024/05/29 11:20:11
最近看MFC看的很辛苦,感觉都快不行了!
现在遇到一个问题。我知道自己写的有点长,不过在这里还是希望各位高人能帮小弟一把,耐心把它看完。
我们都知道在C++中在类中定义的虚函数的作用是:这样可以用一个基类指针指向派生类对象,可以调用派生类中对这个虚函数的重写。在看书的过程中发现这样的用法:
声明基类:
class CWinApp : public CWinThread
{
public:
CWinApp * m_pCurrentWinApp;
public:
CWinApp::CWinApp()
{
m_pCurrentWinApp=this;
cout<<"CWinApp Constructor \n";
}

CWinApp::~CWinApp()
{
cout<<"CWinApp Destructor \n";
}
virtual InitInstance();
}
声明派生类:
class CMyWinApp : public CWinApp
{
public:
CMyWinApp ::CMyWinApp ()
{
cout<<"CMyWinApp Constructor \n";
}
CMyWinApp ::~CMyWinApp ()
{

第一个问题比较有意思,事实这也是C++语言的规范。一个类可以通过其基类类型的指针传递,但不应该以其派生类的类型传递。

第二个问题 与删不删没关,只与虚函数机制有关。

CWinApp * pApp=theApp是有问题的,因为theApp你定义的是一个对象,可以:
CWinApp * pApp=&theApp。不知道你讲的一目了然指的是什么,这里提到的都是C++知识,与MFC并没关系。

我是新手,来说说我的看法:
第一,你贴在上面的程序段肯定不是一个真正的MFC应用框架。可能是你看的树上为了让你搞清楚MFC的内部运行机制而跟你模拟了MFC框架生成过程。
第二,你说的那个问题,CWinApp * pApp=theApp这句话是不对的,你将基类的指针指向派生类的话,VC会进行强制转换。那样的话pApp指向的东西较之theApp会少掉你自己定义的东西。
还有,MFC的源代码不是为你这一个程序设计的,很多代码为了用户的各种选择,写出一些向我这些初学者看起来很“傻”的代码是有他的用意的。

MFC是写WIN32应用程序的,不是控制台程序,入口函数应该是 WinMain,不是 main,也不应该用 cout 流来输出。另外,用MFC写程序也不用写入口函数,MFC已经封装了。