我有两个抽象基类ISolid
和IBox
,分别定义Solid和Box的接口:
using std::unique_ptr<IFace> pIFaces;
using std::unique_ptr<IEdge> pIEdge;
class ISolid
{
public:
virtual const pIFaces& getFaceVector() const = 0;
virtual const pIEdges& getEdgeVector() const = 0;
};
class IBox : public ISolid
{
public:
virtual inline ~IBox() = default;
virtual const IFace& front() const = 0;
virtual const IFace& back() const = 0;
virtual const IFace& left() const = 0;
virtual const IFace& right() const = 0;
virtual const IFace& top() const = 0;
virtual const IFace& bottom() const = 0;
};
随后,我已经定义了一个真正的ISolid实现,Solid
如下:
class Solid : public ISolid
{
public:
Solid(const TopoDS_Solid& aSolid);
const pIEdges& getEdgeVector() const override;
const pIFaces& getFaceVector() const override;
const TopoDS_Solid& getSolid() const;
protected:
TopoDS_Solid mySolid;
pIEdges myEdges;
pIFaces myFaces;
};
最后,我试图按如下方式定义IBox的实际实现:
class Box : public Solid , public IBox
{
public:
Box(BRepPrimAPI_MakeBox mkBox);
~Box(){};
const pIFaces& getFaceVector() const override;
const pIEdges& getEdgeVector() const override;
const IFace& front() const override;
const IFace& back() const override;
const IFace& left() const override;
const IFace& right() const override;
const IFace& top() const override;
const IFace& bottom() const override;
private:
BRepPrimAPI_MakeBox myMakeBox;
std::map<std::string, int> myIndices;
};
如何更改设计以避免Box
中的多重继承?我想保留ISolid
和IBox
接口,因为这允许我传递指针或对ISolid
或IBox
的引用而不关心它的实际实现。此外,我需要操纵固体对象和框对象。换句话说,OccSolid
不能保持虚拟。
我最好从Solid
中删除Box
的继承,并添加Solid
类型的成员变量吗?然后,我必须添加实现ISolid
中缺少的方法的代码(在IBox
中继承),然后必须为其他ISolid
个继承者执行此操作(即ICylinder
等等......)如果可能的话,我想避免使用这个样板。
我已经考虑在ISolid
上完全从Box
删除继承,但我想/需要/ ISolid
的指针/引用能够引用{{1}或Solid
。这是因为Box
是 Box
。我想我可以复制Solid
中的ISolid
接口(以及IBox
等...)但这会导致I系列中的并行代码库接口,我想避免这种情况。
最后,我还考虑在ICylinder
和IBox
中使用虚拟继承,以解决死亡钻石问题。我对这种方法的唯一问题是,以下代码片段中的某些内容似乎不起作用:
Solid
您可以在此示例中看到using std::unique_ptr<ISolid> pISolid;
pISolid MakeFusion(const pISolid& shape1, const pISolid& shape2)
{
const Solid& solid1 = static_cast<const Solid&>(*shape1);
const Solid& solid2 = static_cast<const Solid&>(*shape2);
return FusionOf(solid1.getSolid(), solid2.getSolid());
}
可以是常规shape1
,而Solid
可以是shape2
(更具体的固体类型)。我用这样的代码得到的编译错误是:
Box
请注意,此问题并非专门针对此编译错误,因此我没有提供最小的工作示例来重现它。