我的案例类似于"死亡的钻石"
我有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)是愚蠢的
所以我想知道这种情况的最佳实践是什么?
答案 0 :(得分:0)
最佳做法是不要在你的班级继承中制作钻石。这将永远导致问题,最好避免。评估继承中的每个链接,并考虑是否可以执行不同的操作,例如在某些时候使用组合或者将基类改为纯虚拟接口。
如果你真的想保留这种继承,那么不要使A::save()
成为虚方法,而是创建一个受保护的纯虚A::onSave()
方法,而不是希望在每个派生类中重写。 A::save()
将执行其需要执行的操作,然后致电onSave()
。 B和C都将实现onSave()
并执行他们需要做的事情,但不会调用A::onSave()
(因为它是纯虚拟的)。 D将实施onSave()
并致电B::onSave()
和C::onSave()
。这适用于本案的问题,但如果你制作这样的继承钻石,你将会遇到更多这样的问题。