シリアライゼーション関数のすべての派生クラスの実装を再設計することを避けたい場合は、ベースから派生クラスへの別の方向に進むことができます。
基本クラスで、シリアル化プロセスを開始するための非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();
}