为什么CObList类的Serialize函数实现里要先调用CObject::Serialize(ar);

liuqiloveccj 2014-09-21 12:15:32
为什么要先调用基类的函数呢?

我查看了一下MFC的代码,如下:
void CObList::Serialize(CArchive& ar)
{
ASSERT_VALID(this);

CObject::Serialize(ar);

if (ar.IsStoring())
{
ar.WriteCount(m_nCount);
for (CNode* pNode = m_pNodeHead; pNode != NULL; pNode = pNode->pNext)
{
ASSERT(AfxIsValidAddress(pNode, sizeof(CNode)));
ar << pNode->data;
}
}
else
{
DWORD nNewCount = ar.ReadCount();
CObject* newData;
while (nNewCount--)
{
ar >> newData;
AddTail(newData);
}
}
}



_AFX_INLINE void CObject::Serialize(CArchive&)
{ /* CObject does not serialize anything by default */ }

...全文
229 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2014-09-22
  • 打赏
  • 举报
回复
重写虚函数的习惯是在第一行调用父类的函数,这样做的目地在于父类的该函数可能做了很多事情,如果你重写了又不掉哟个父类的实现就会出现问题,但是如果父类该函数什么都没做,你就可以不加它,加它只是为了保持一种良好的习惯,你可以看看CObject::Serialize的实现,他确实什么都没做:
_AFX_INLINE void CObject::Serialize(CArchive&)
	{ /* CObject does not serialize anything by default */ }
真相重于对错 2014-09-21
  • 打赏
  • 举报
回复
想一想,如果不写会怎样,如果是读会怎样?
liuqiloveccj 2014-09-21
  • 打赏
  • 举报
回复
使用的是《深入浅出MFC》的scribble例子代码
liuqiloveccj 2014-09-21
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
想一想,如果不写会怎样,如果是读会怎样?
我注释掉 CObject::Serialize(ar); 重新编译,还是能正常读写
liuqiloveccj 2014-09-21
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
想一想,如果不写会怎样,如果是读会怎样?
CObject::Serialize什么也没有做啊

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧