【问题标题】:c++ Writing to Binary files from multiple inheritance classc ++从多继承类写入二进制文件
【发布时间】:2017-06-05 23:21:48
【问题描述】:

我有一个类似“死亡钻石”的案例

我有 B 类和 C 类,它们实际上继承了 A 类, 还有继承B类和C类的D类。

  A  
 / \  
B   C  
 \ /  
  D 

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

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

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

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

现在在为D写Save方法的时候,基本上只需要做:

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

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

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

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

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。

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


【解决方案1】:

最好的做法是不要在你的类继承中创建菱形。这总是会引起问题,最好避免。评估继承中的每个链接,并考虑是否可以做一些不同的事情,例如在某些时候使用组合或将基类改为纯虚拟接口。

如果您真的想保留该继承,那么不要将A::save() 设为虚拟方法,而是创建一个受保护的纯虚拟A::onSave() 方法,而不是在每个派生类中重写该方法。 A::save() 会做它需要做的事情,然后打电话给onSave()。 B 和 C 都会实现onSave() 并做他们需要做的事情,但不会调用A::onSave()(因为它是纯虚拟的)。 D 将实现onSave() 并调用B::onSave()C::onSave()。这解决了这个案例的问题,但如果你像这样制作继承钻石,你总是会遇到更多这样的问题。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多