C ++ множественное наследование чтения из файла сохранить объект дважды - PullRequest
0 голосов
/ 02 июня 2018

сначала позвольте мне объяснить мою иерархию:

         Animal
       /    |   \
   Mammal  Fish  Birds  
   /    \ /        \
Horse   MammalFish Flamingo
         /     \
    Mermaid   GoldFish

Каждый класс имеет следующие методы:

Save(ofstream & ofs) // Saves the data to txt file
Load(ifstream & ifs) // Load the data from txt file
Constructor(ifstream & ifs) { Load(ifs) } // Constructor from file, uses `Load` method.

Каждый класс реализует свой собственный метод Load / Save (если у них есть какие-либо данныечленов) и вызывает предыдущий класс в иерархии метода Load / Save.

Проблема заключается в моем множественном наследовании, когда я использую Mermaid или GoldFish метод Save, он спасает животных дважды (что в основном делаетсмысл), но я не могу найти способ избежать этого ..

Другая проблема связана с конструктором, он автоматически вызывает все конструкторы по умолчанию базовых классов (что нежелательно, должен вызывать только Load(), которыйвызывает методы базового класса).Я не могу явно вызывать конструкторы базового класса, потому что в моем методе Load() я также вызываю методы базового класса Load(), что заставит меня использовать Load() дважды.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Виртуальное наследование должно решить проблему diamond , которая существует для MammalFish в вашем дереве наследования.Также требуется, чтобы вы объявили оба метода Load и Save виртуальными, если они будут присутствовать во всех классах.

Для проблемы конструктора каждый конструктор дочернего класса сначала вызовет конструкцию базового класса, чтобы обеспечить базовый классправильно инициализируется;Вот как работает наследование.В вашем случае вы можете не звонить Load из конструктора.Вместо этого его следует вызывать из отдельного метода инициализации.

0 голосов
/ 02 июня 2018

Что-то пришло в голову, о чем я, по общему признанию, никогда не слышал прежде, так что это может быть плохой идеей, но в любом случае;это должно работать:

Следуйте за каждым load() вызовом с вызовом endLoad().Каждый объект выполняет только один load() в последовательности load() с и игнорирует последующие, пока не встретится endLoad().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...