具有专有基础的 C++ 多重继承 Class

C++ Multiple Inheritance With Proprietary Base Class

我正在使用 SFML(Simple Fast Media Library)进行业余游戏设计项目,运行 在使用 sf::Sprite、sf::Drawable 和克隆时遇到了一个相当烦人的难题.这是问题所在:

作为复合和工厂设计模式的忠实拥护者,我程序中的许多对象都包含指向抽象基的指针的成员,这些基可能是单个基元,也可能是 sf::Drawable 的复合。为了解决使用抽象对象创建 copy-construction/factory 的问题,我一直在使用继承自广泛使用的 'Clonable' 基础 class 的 'clone' 方法形式的类型协变。作为一个具体的例子,我创建了抽象 class '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 的复合体,它们也是可克隆的。问题是,我希望这些复合成员也能够成为 sf::Sprite,它派生自 sf::Drawable。这将创建一个菱形,因为 sf::Sprite 和 Graphic 都继承自 sf::Drawable。通常情况下,虚拟继承会有所帮助,但 sf::Sprite 属于 SFML,而不是我。

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

总结:当第一个派生的 class 中的一个(或两个)是 proprietary/inaccessible 时,如何解决菱形问题?

另一个可能的途径:您还可以如何向 C++ 承诺一个对象将满足多个要求(绘制和克隆)而无需多重继承?

谢谢,

约旦

每当我 运行 遇到继承问题时,我都会考虑用组合替换它,这是向现有 类.

添加行为的另一种有效方法
class Graphic : public Clonable {
public:
    const sf::Drawable& getDrawable() const { return *drawable;  }
private:
    sf::Drawable* drawble;
};

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