1. 持续性
从CObject类直接或间接继承下来的类能维护一个对象持续性。即将内存中的对象数据保存到持久
介质,或反过来,从持久介质中读取数据,然后重建对象。例如,CStudent类是从CObject类的派
生类,那么CStudent从CObject自然地继承得到了一个担任数据持续化的虚函数
Serialize(CArchive &ar),只要调用该函数,CStudent对象便可完成持续化,即完成CStudent对象的文件存取。
CArchive对象ar保存了以读或写的方式打开的文件的相关信息,如文件句柄等。Serialize()函数的主
要逻辑已封闭在CObject对象中,但是对什么数据进行操作,将依赖于各类对该虚函数的重载。
2. 动态性
前面已介绍过文档类、视图类、窗口框架类的动态创建。但从CObject类派生的类只具有一般意义上
的动态性,例如,CStudent是CObject的派生类,那么CStudent自然从CObject得到一个成员函数
IsKindOf(CRunTimeClass*ptr),只要调用该函数,CStudent对象就可以判断该类指针所指是不是CStudent类对象。
3. 诊断性
CObject类提供了把对象状态转储给调试机制(如Debug输出窗口)的能力。CObject类有两种存储
方式,通过CDumpContext类或者AssertValid()成员函数。Dump()成员函数能够把类的内部数据输
出到CDumpContext类对象afxDump中,而afxDump是与调试输出窗口绑定的;AssertValid()成员函数能够自动维护数据的有效性。
例如,在任一个SDI应用程序中,文档类都是CObject的派生类,自然继承了Dump()和AssertValid()
函数,如程序清单8-13所示。
#ifdef _DEBUG
void CMy05262Doc::AssertValid() const
{
ASSERT(!m_strName.IsEmpty()); // 不能为空
ASSERT(!(m_nAge < 0)); // 不能小于0
CDocument::AssertValid();
}
void CMy05262Doc::Dump(CDumpContext& dc) const
{
dc << "m_strName:" << m_strName << "\n";
dc << "m_nAge:" << m_nAge << "\n";
CDocument::Dump(dc);
}
#endif //_DEBUG
// 构造函数和析构函数
CMy05262Doc::CMy05262Doc()
{
m_strName = _T("liangjisheng");
m_nAge = 1;
}
CMy05262Doc::~CMy05262Doc()
{
#ifdef _DEBUG
Dump(afxDump);
#endif
}