具有专有基类的{C ++多重继承

时间:2016-01-08 20:40:22

标签: c++ inheritance sfml diamond-problem

我在一个业余爱好者游戏设计项目中使用SFML(简单快速媒体库),并遇到了一个令人讨厌的难题,使用sf :: Sprite,sf :: Drawable和克隆。问题在于:

作为复合和工厂设计模式的主要粉丝,我程序中的许多对象都包含指向抽象基础的成员,这些抽象基础可以是单个基元,也可以是sf :: Drawable的复合体。为了解决使用抽象对象进行复制构造/工厂创建的问题,我一直在使用类型协方差的形式克隆'从广泛使用的“Clonable”中继承的方法。基类。作为一个具体的例子,我创建了抽象类' Graphic'它代表一个可克隆的可绘制原语:

    class Clonable{
    public:
        virtual Clonable* clone() const = 0;
    };

    class Graphic: public sf::Drawable, public Clonable{
    public:
        virtual Graphic* clone() const = 0;
        // Derivatives define as: {return new MyClass(*this);}
    };

有了这个,我设计了多个Graphic的复合材料,它们也是Clonable。问题是,我希望这些复合成员能够成为sf :: Sprite,它派生自sf :: Drawable。这会创建一个菱形,因为sf :: Sprite和Graphic都继承自sf :: Drawable。通常情况下,虚拟继承会受到拯救,但sf :: Sprite由SFML拥有,而不是我。

我考虑过编辑他们的源代码并重新编译库,但这感觉就像是屠杀。每当SMFL决定更新他们的库时,我都需要每次都破解并重新编译它们的源代码。

总结:当第一个派生类中的一个(或两个)是专有/不可访问时,如何解决钻石问题?

另一种可能的途径:你怎么能承诺c ++一个对象在没有多重继承的情况下满足多个要求(绘制和克隆)?

谢谢,

约旦

1 个答案:

答案 0 :(得分:1)

每当我遇到继承问题时,我会考虑用组合替换它,这是向现有类添加行为的另一种有效方法。

class Graphic : public Clonable {
public:
    const sf::Drawable& getDrawable() const { return *drawable;  }
private:
    sf::Drawable* drawble;
};

然后,Graphic是Clonable,但它也通过getDrawable()方法公开了一个可绘制的接口。