具有专有基础的 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() 方法公开了一个可绘制接口。
我正在使用 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() 方法公开了一个可绘制接口。