Хранение массива объектов дочерних классов в файле

Написал простинькую иерархию классов которая реализует класс People и два дочерних класса Teacher и Student. Как мне хранить объекты дочерних классов в файле?

 class People
{
protected:
    std::string m_name;
    int m_age;
    std::string m_sex;

public:
    People(std::string name = "", int age = 0, std::string sex = "")
        : m_name(name), m_age(age), m_sex(sex) {}

std::string getName()
{
    return m_name;
}

int getAge()
{
    return m_age;
}

std::string getSex()
{
    return m_sex;
}
};

class Teacher : public People
{
private:
    std::string m_position;
    float m_experience;

public:
    Teacher(std::string name = "", int age = 0, std::string sex"", 
    std::string position = "", float experience = 0.0)
    : People(name, age, sex),
        m_position(position), m_experience(experience) {}

std::string getPosition()
{
    return m_position;
}

float getExperience()
{
    return m_experience;
}
};

class Student : public People
{
private:
    std::string m_faculty;
    double m_average_rating;

public:
    Student(std::string name = "", int age = 0, std::string sex = "", 
std::string faculty = "", double average_rating = 0.0)
    :  People(name, age, sex),
        m_faculty(faculty), m_average_rating(average_rating) {}

std::string getFaculty()
{
    return m_faculty;
}

double getAverageRating()
{
    return m_average_rating;
}
};

Ответы (1 шт):

Автор решения: Андрей Туманов

Если делать свой велосипед, то проще всего таким образом:

  1. Исхожу из предположения, что данные объектов будут сохраняться в текстовый файл. Если необходимо сохранять в двоичном формате, то тип выходного параметра нужно изменить
  2. В базовом классе создаем два виртуальных метода getData() возвращающий строку и setData(..) принимающий на вход строку с данными. Эти методы могут быть абстрактными или содержать код, обрабатывающий данные базового класса - зависит от реализации иерархии классов
  3. Каждый потомок переопределяет методы getData() и setData() с добавлением в возвращаемую строку своих данных и с обработкой принятых данных в соответствии со своей реализацией
  4. В процессе записи данных в файл записываем последовательно сначала тип данных (объект какого класса сохраняем), если нужно, то длину сохраняемых данных, ну и сами данные, которые возвращает метод getData() сохраняемого объекта
  5. В процессе чтения данных из файла анализируем тип сохраненного объекта, в соответствии с этим создаем новый экземпляр требуемого класса. Для созданного экземпляра вызываем метод setData() и передаем в него считанную из файла строку
→ Ссылка