从 CObject 派生类
本文介绍从 CObject 派生类至少需要的步骤。 其他 CObject
类文章介绍了利用特定 CObject
功能(如序列化和诊断调试支持)所需的步骤。
在 CObject
的讨论中,经常使用术语“接口文件”和“实现文件”。 接口文件(通常称为头文件,或 .H 文件)包含类声明和使用该类所需的任何其他信息。 实现文件(或 .CPP 文件)包含类定义以及实现类成员函数的代码。 例如,对于名为 CPerson
的类,通常创建一个名为 PERSON.H 的接口文件和名为 PERSON.CPP 的实现文件。 但是,对于一些不会在应用程序之间共享的小类,有时将接口和实现组合成单个 .CPP 文件会更容易。
从 CObject
派生类时,可以从四个级别的功能中进行选择:
基本功能:不支持运行时类信息或序列化,但包括诊断内存管理。
基本功能加上对运行时类信息的支持。
基本功能加上对运行时类信息和动态创建的支持。
基本功能加上对运行时类信息、动态创建和序列化的支持。
为重用而设计的类(以后将用作基类的类)至少应包括运行时类支持和序列化支持(如果预期将来有任何序列化需求)。
通过在从 CObject
派生的类的声明和实现中使用特定的声明和实现宏来选择功能级别。
下表显示了用于支持序列化和运行时信息的宏之间的关系。
用于序列化和运行时信息的宏
使用的宏 | CObject::IsKindOf | CRuntimeClass:: CreateObject |
CArchive::operator>> CArchive::operator<< |
---|---|---|---|
基本 CObject 功能 |
否 | No | No |
DECLARE_DYNAMIC |
是 | No | No |
DECLARE_DYNCREATE |
是 | 是 | 否 |
DECLARE_SERIAL |
是 | 是 | 是 |
使用基本 CObject 功能
使用普通 C++ 语法从
CObject
(或从CObject
派生的类)派生类。下面的示例演示最简单的情况,即从
CObject
派生类:class CSimple : public CObject { // add CSimple-specific members and functions... };
但是,通常情况下,最好替代 CObject
的某些成员函数来处理新类的详细信息。 例如,通常建议替代 CObject
的 Dump
函数,以便为类的内容提供调试输出。 有关如何替代 Dump
的详细信息,请参阅对象转储自定义一文。 还建议替代 CObject
的 AssertValid
函数,以提供自定义测试来验证类对象的数据成员是否一致。 有关如何替代 AssertValid
的说明,请参阅 MFC ASSERT_VALID 和 CObject::AssertValid。
指定功能级别一文介绍如何指定其他级别的功能,包括运行时类信息、动态对象创建和序列化。