说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

请教《深入浅出MFC》中有关“动态创建”的一个问题。

编辑:说三道四文库 发布时间:2018-02-24 12:19
HTML文档下载 WORD文档下载 PDF文档下载
在第3章“MFC六大关键技术之仿真”中的Frame6范例程序(用来测试动态创建)。有这样一个执行结果:

enter a class name...  CMyView  //屏幕提示输入类名称
CWnd Constructor
CMyView Constructor
Hello CMyView

已知继承关系是 CWnd->CView->CMyView,其中CWnd和CMyView都已利用
DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE这两个宏实现动态创建能力,而
CView只被DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC声明过。

我想请问:看屏幕显示的话,CView并未被构造,但CMyView可以不经CView,而在
CWnd的基础上构造吗?我想不通。
首先澄清 在C++中除了纯虚类之外,任何一个类都可以被创建。宏IMPLEMENT_DYNCREATE与DECLARE_DYNAMIC的差别是多了一个static CObject* Create().这个函数的功能只是为了生成一对象,并将指针传回。CView没有这个函数并不表明CView不能被创建。此时CView中的RuntimeClass的函数指针CObject* (Pascal * CreateObject)()是NULL, 而CWnd的RuntimeClass中的是指向static CObject* Create().

这样解释明白了吗?:)
谢谢HornblowerI的回复。
但可能我的问题没表述清楚。
我是这么想的,当程序通过比较待创建的类名和型录网中已存在的类信息,发现二者相匹配,并且m_pfnCreateObject!=NULL后,就可以利new,来创建一个类对象。而此后创建类对象的过程,我觉得,已经与“动态创建”无关了。那么单纯创建一个CMyView对象,不是应该按照
CWnd Constructor
CView Constructor
CMyView Constructor
的顺序来吗?
还请指教。谢谢。
gz
不好意思,是我看书不细,CView的构造函数根本没有“CView Constructor”这句声明,是空的。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘