2

我有多重继承的问题。

我想要一个 IEdge 类来实现 QGraphicsItem“接口”,其中包含 boundindRect() 和 paint(...) 抽象方法。IEdge 还添加了一些新方法。

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

现在我想创建 UndirectedEdge,它扩展了 IEdge,但我不想自己实现 boundingRect() 和 paint(...),我想使用 IQGraphicsLineItem 实现。

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

}

但这不起作用,编译器说 UndirectedEdge 是抽象的,因为 boundingRect() 和 paint(...) 没有实现(但我确信, IGraphicsLineItem 包含这些方法)。我不知道,为什么它不起作用。非常感谢您的解释。

编辑:

我可以解决这个问题,但我只是好奇。在我的主要语言 C# 中它会起作用,我错过了一些关于 C++ 继承的重要内容:-( ...一些提示将不胜感激,谢谢。

4

3 回答 3

2

我假设您的意思是您继承自QGraphicsLineItem,而不是IGraphicsLineItem。(如果我错了,请更正。) QGraphicsLineItem继承自QGraphicsItem.

因为您没有使用虚拟继承,所以您的UndirectedEdge对象实际上包含以下两个实例QGraphicsItem

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

其中只有一个具有正确覆盖的抽象函数(那个QGraphicsLineItem)。编译器一定在抱怨另一个。

如果您希望我详细说明这个解释,请告诉我 - 我知道它很短!

于 2013-03-13T03:13:15.387 回答
1

编译器是正确的:

IEdge::boundingRect() 没有实现,IGraphicsLineItem::boundingRect() 是。
IEdge::paint() 没有实现,IGraphicsLineItem::paint() 是。

正如 Ron 所说,您可以像这样委派这些任务: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 回答