如果你想避免重新设计所有派生类的序列化函数实现,你可以从另一个方向走,从基类到派生类:
在您的基类中提供一个非virtual
函数来启动序列化过程。客户端代码通过指针(或引用)调用此函数。还提供一个为子类进行序列化的虚函数。从基类的函数中调用该Serialize
函数。
(编辑)如果您想为序列化子类提供默认功能,但仍希望能够为特定情况提供专门的功能,那么序列化子类的函数不必是纯虚拟的。但是,通过阅读您的 OP,在我看来,每个子类都需要提供此功能。为了模拟该要求,我在DoSerialize
这里将函数设为纯虚拟。
例子:
class Base
{
public:
void Serialize() const;
virtual void DoSerialize() = 0;
};
class Derived : public Base
{
public:
void DoSerialize() { /* MAGIC HAPPENS */ };
};
void Base::Serialize() const
{
/* .. do serialization of base class here, or at the end -- whichever is appropriate .. */
this->DoSerialize(); // serialize the derived class
}
/* ... */
Base* GetObject()
{
/* ... */
}
int main()
{
Base* obj = GetObject();
obj->Serialize();
}