我在一个爱好者游戏设计项目中使用 SFML(简单快速媒体库),在使用 sf::Sprite、sf::Drawable 和克隆时遇到了一个相当烦人的难题。这是问题所在:
作为复合和工厂设计模式的忠实拥护者,我程序中的许多对象都包含指向抽象基类的指针的成员,这些基类可能是单个基元,也可能是 sf::Drawable 的复合体。为了解决抽象对象的复制构造/工厂创建问题,我一直在使用继承自广泛使用的“可克隆”基类的“克隆”方法形式的类型协变。作为一个具体的例子,我创建了抽象类“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 决定更新他们的库时,我每次都需要破解并重新编译他们的源代码。
总结:当第一个派生类中的一个(或两个)是专有的/不可访问时,您如何解决菱形问题?
另一个可能的途径:您还可以如何向 C++ promise 一个对象将满足多个要求(绘制和克隆)而无需多重继承?
谢谢,
乔丹
最佳答案
每当我遇到继承问题时,我都会考虑用组合来代替它,这是向现有类添加行为的另一种有效方法。
class Graphic : public Clonable {
public:
const sf::Drawable& getDrawable() const { return *drawable; }
private:
sf::Drawable* drawble;
};
Graphic 是一个 Clonable,但它还通过其 getDrawable() 方法公开了一个可绘制接口(interface)。
关于具有专有基类的 C++ 多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34685696/