来自同一物理类的多重继承

时间:2012-11-28 15:55:39

标签: c++ inheritance

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

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

我希望从 phyiscally相同的 Onotes继承几个Cmelody,因为它们都需要相互识别,我不能将这两个类都包含在这两个类中?看起来我需要虚拟继承,但有了它,对于每个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..
};

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

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

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

//various variables and some functions listed..

private:
    CMelody* melody;
};

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