如何在此示例中删除多重继承?

时间:2018-03-05 03:54:30

标签: c++ multiple-inheritance diamond-problem

背景

我有两个抽象基类ISolidIBox,分别定义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中的多重继承?我想保留ISolidIBox接口,因为这允许我传递指针或对ISolidIBox的引用而不关心它的实际实现。此外,我需要操纵固体对象和框对象。换句话说,OccSolid不能保持虚拟。

我最好从Solid中删除Box的继承,并添加Solid类型的成员变量吗?然后,我必须添加实现ISolid中缺少的方法的代码(在IBox中继承),然后必须为其他ISolid个继承者执行此操作(即ICylinder等等......)如果可能的话,我想避免使用这个样板。

考虑选项

我已经考虑在ISolid上完全从Box删除继承,但我想/需要/ ISolid的指针/引用能够引用{{1}或Solid。这是因为Box Box。我想我可以复制Solid中的ISolid接口(以及IBox等...)但这会导致I系列中的并行代码库接口,我想避免这种情况。

最后,我还考虑在ICylinderIBox中使用虚拟继承,以解决死亡钻石问题。我对这种方法的唯一问题是,以下代码片段中的某些内容似乎不起作用:

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

请注意,此问题并非专门针对此编译错误,因此我没有提供最小的工作示例来重现它。

0 个答案:

没有答案
相关问题