Если вы хотите избежать перепроектирования всех реализаций функций производного класса для функций сериализации, вы можете пойти в другом направлении, от базового к производным классам:
В вашем базовом классе предусмотрена функция, отличная от 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();
}