2

多重継承に問題があります。

クラスIEdgeに、boundindRect()およびpaint(...)抽象メソッドを含むQGraphicsItem「インターフェイス」を実装する必要があります。IEdgeは、いくつかの新しいメソッドも追加します。

class IEdge : public QGraphicsItem
{
public:
virtual Vertex * getVertex1() = 0;
virtual Vertex * getVertex2() = 0;
}

ここで、IEdgeを拡張するUndirectedEdgeを作成したいのですが、boundingRect()とpaint(...)を自分で実装したくないので、IQGraphicsLineItem実装を使用したいと思います。

class UndirectedEdge : public IEdge, public IGraphicsLineItem
{
public:
virtual Vertex* getVertex1();
virtual Vertex* getVertex2();

}

しかし、それは機能しません。コンパイラは、boundingRect()とpaint(...)が実装されていないため、UndirectedEdgeは抽象的であると言います(ただし、IGraphicsLineItemにはこれらのメソッドが含まれていると確信しています)。なぜそれが機能しないのか、私にはわかりません。説明ありがとうございます。

編集:

私はこれを解決することができますが、私は興味があります。私の第一言語C#ではそれは機能しますが、C++での継承について重要な何かが欠けています:-(...いくつかのヒントをいただければ幸いです。ありがとうございます。

4

3 に答える 3

2

私はあなたがからQGraphicsLineItemではなく、から継承していることを意味すると思いますIGraphicsLineItem。(間違っている場合は訂正してください。) QGraphicsLineItemから継承しQGraphicsItemます。

仮想継承を使用していないため、オブジェクトには実際には次の2つのインスタンスが含まれています。UndirectedEdgeQGraphicsItem

UndirectedEdge::IEdge::QGraphicsItem // 1st instance of QGraphicsItem - abstract functions not defined!!
UndirectedEdge::QGraphicsLineItem::QGraphicsItem // 2nd instance - abstract items are defined just fine

これらのうちの1つだけが、その抽象関数を適切にオーバーライドします(QGraphicsLineItem1つ)。コンパイラはもう一方について不平を言っているに違いありません。

この説明について詳しく説明してほしい場合は、お知らせください。かなり短いと思います。

于 2013-03-13T03:13:15.387 に答える
1

コンパイラは正しいです:

IEdge :: boundingRect()は実装されていませんが、IGraphicsLineItem :: boundingRect()は実装されています。
IEdge :: paint()は実装されていませんが、IGraphicsLineItem :: paint()は実装されています。

ロンが言ったように、あなたは次のようにこれらのタスクを委任することができます:http: //ideone.com/mfdr0p

#include <iostream>

class Base1
{
public:
  virtual void func1() = 0;
};

class Base2
{
public:
  virtual void func1();
};

void Base2::func1()   // This is the function you want to use
{
  std::cout << "Base2::func1()" << std::endl;
}

class Derived : public Base1
{
public:
  virtual void func1();   // Override as normal
private:
  Base2 m_base2;
};

void Derived::func1()
{
  m_base2.func1();   // Delegation happens here
}
于 2013-03-13T00:06:00.930 に答える
0

委任を使用する必要があります。IQGraphicsLineItemインスタンスを使用してUndirectedEdgeを構築するだけで、適切な呼び出しを委任できます。

于 2013-03-12T23:53:31.840 に答える