C++两次从文件保存对象读取多重继承

C++ multiple inheritance reading from file save object twice

本文关键字:保存 文件 对象 读取 多重继承 两次 C++      更新时间:2023-10-16

首先让我解释一下我的层次结构:

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 方法中的前一个类。

问题在于我的多重继承,当我使用MermaidGoldFishSave 方法时,它会保存动物两次(这基本上是有道理的(,但我找不到避免这种情况的方法。

另一个问题是构造函数,它会自动调用所有基类默认构造函数(这是不需要的,应该只调用调用基类方法的Load()(。我不能显式调用基类构造函数,因为在我的Load()方法中,我也调用基类Load()方法,这将使我使用Load()两次。

谢谢。

虚拟继承应该解决继承树中MammalFish存在的菱形问题。此外,它还要求您将 Load 和 Save 方法声明为虚拟方法,如果它们将位于所有类中。

对于构造函数问题,每个子类构造函数将首先调用基类构造,以确保基类正确初始化;这就是继承的工作方式。在您的情况下,您可以考虑不从构造函数调用Load。相反,它应该从单独的初始化方法调用。

我想到了一些我以前从未听说过的东西,所以这可能是一个坏主意,但无论如何; 这应该有效:

通过endLoad()呼叫跟踪每个load()呼叫。每个对象仅执行load()序列中的一个load(),并忽略后续,直到遇到endLoad()