c ++从多个继承类写入二进制文件

时间:2017-06-05 23:21:49

标签: c++ visual-studio inheritance binaryfiles diamond-problem

我的案例类似于"死亡的钻石"

我有B级和C级,几乎继承了A级, 以及继承类B和C的D类。

  A  
 / \  
B   C  
 \ /  
  D 

B& C继承了成员,也有自己的成员。 D只是继承了成员。

我正在编写获取流的Save方法,并应将Object写入二进制文件。

一个获取ifstream的Load方法,应该从二进制文件创建对象。

方法是虚拟的并且以这样的方式编写,即每个类方法只处理特定的类成员Load&保存(并为其余的继承成员使用继承的类方法)

现在为D编写Save方法时,基本上我只需要这样做:

B.save();
C.save();

显然这会导致A.save()被调用两次,这会导致A被写入文件两次

我认为像向B和C添加一个saveOnly方法只会保存他们的成员(而不是A' s)是愚蠢的

所以我想知道这种情况的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

最佳做法是不要在你的班级继承中制作钻石。这将永远导致问题,最好避免。评估继承中的每个链接,并考虑是否可以执行不同的操作,例如在某些时候使用组合或者将基类改为纯虚拟接口。

如果你真的想保留这种继承,那么不要使A::save()成为虚方法,而是创建一个受保护的纯虚A::onSave()方法,而不是希望在每个派生类中重写。 A::save()将执行其需要执行的操作,然后致电onSave()。 B和C都将实现onSave()并执行他们需要做的事情,但不会调用A::onSave()(因为它是纯虚拟的)。 D将实施onSave()并致电B::onSave()C::onSave()。这适用于本案的问题,但如果你制作这样的继承钻石,你将会遇到更多这样的问题。