【问题标题】:Multiple inheritance from same physical class来自同一物理类的多重继承
【发布时间】:2012-11-16 13:04:18
【问题描述】:

我有一个类 Onote,它是 Qt 的扩展 QGraphicsItem

我想创建另一个类Cmelody,其中包含属于该旋律的Onote 项目的列表以及所有这些音符共享的一些值,例如iTempo

我希望从物理上相同 Cmelody 继承几个Onotes,因为它们都需要相互识别,我不能将这两个类都包含到这两个类中?似乎我需要虚拟继承,但有了它,每个Onote 都会有它自己的Cmelody

是否可以创建一个系统,例如,Cmelody c1 将继承 Onote o1Onote o2;而Cmelody c2 会继承Onote o3Onote o4Onote o5?当我更改 Cmelody 中的一个值时,其所有 Onote 子级在从其 Cmelody 父级读取它时将获得相同的值。

为了演示,类结构大致如下:

class Cmelody
{
public:
    Cmelody(void);
    ~Cmelody(void);
std::vector<Onote*> notes;
//a handful of variables and a function..
};

class Onote : public QGraphicsitem
{
public:
    Onote(QObject* parent);
    ~Onote(void);
//various variables and some functions listed..
};

【问题讨论】:

  • 如果您在对象实例之间共享数据,这不是继承。为此使用合成。
  • 在处理 C++ 时,请小心使用“继承”一词。实际上,您希望在OnoteCMelody 之间存在继承层次结构,因为Onote 不是 CMelody
  • 如果我使用作曲不会为每个音符创建一个新的旋律,这是我问题的前提吗?我应该使用什么“东西”,以便它可以监督与其关联的多个类?
  • @deprecated:如果你有很多音符,每个音符都需要引用包含它的旋律,那么每个音符都应该有一个指向该旋律的引用或指针。
  • @deprecated "inherit" 在 C++ 中指的是类之间的关系而不是它们的实例。

标签: c++ inheritance


【解决方案1】:

如果我理解了你的问题,那么你只需要这个

class Onote;   // <== Forward declaration of Onote
class Cmelody
{
public:
    Cmelody(void);
    ~Cmelody(void);
std::vector<Onote*> notes;
//a handful of variables and a function..
};

class Onote : public QGraphicsitem
{
public:
    Onote(Cmelody* parent) : parent_(parent) {} // <=== Save a pointer to Cmelody
    ~Onote(void);
//various variables and some functions listed..
private:
   Cmelody* parent_;
};


int main ()
{
   Cmelody melody;
   melody.notes.push_back (new Onote (&melody));
   melody.notes.push_back (new Onote (&melody));
   melody.notes.push_back (new Onote (&melody));
   melody.notes.push_back (new Onote (&melody));
}

【讨论】:

  • 可能是std::vector&lt;Onote&gt; notes 而不是&lt;Onote*&gt;
  • @peterph,取决于他是否希望 Onote 具有多态性
【解决方案2】:

根据您的描述,我认为您是说音符应该指包含它们的旋律;这与继承是一个非常不同的概念。为此,它们需要包含对旋律的引用或指针:

class Onote : public QGraphicsitem
{
public:
    Onote(QObject* parent, CMelody* melody) : melody(melody) {}

//various variables and some functions listed..

private:
    CMelody* melody;
};

继承意味着一个音符是一个旋律(就像它是一个图形项目,显然)——事实并非如此。

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 2012-02-15
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多