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

标签 c++ inheritance sfml diamond-problem

我在一个爱好者游戏设计项目中使用 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/

相关文章:

c# - 部署不会生成 ttf 文件

c++ - std::atomic 中的任何内容都是免等待的?

C++:有符号 64 位整数中两个无符号 64 位整数的差

c++ - 如果告诉线程休眠零秒,线程会休眠吗?

c++ - 仅在 SFML 中的特定帧上执行

c++ - 从 gcc 5.4 升级到 gcc 6.3 std::thread std:ref 问题

c++ - 桌面/屏幕视频采集/录像库 "pc not mobile "[c++/Qt]

inheritance - TypeScript:应该推断继承方法中的参数类型

c# - C#中从基类调用重写的方法

wpf - 从应用程序样式 (WPF) 继承