c ++中的多重继承(Qt示例)

时间:2013-03-12 23:50:23

标签: c++ qt multiple-inheritance

我有多重继承问题。

我想要一个类IEdge来实现QGraphicsItem“接口”,它包含boundindRect()和paint(...)抽象方法。 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();

}

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

修改:

我可以解决这个问题,但我只是好奇。在我的主要语言C#中它会起作用,我遗漏了一些关于C ++继承的重要内容:-( ...有些提示会受到赞赏,谢谢。

3 个答案:

答案 0 :(得分: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一个)。编译器必须抱怨另一个。

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

答案 1 :(得分: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
}

答案 2 :(得分:0)

您应该使用delegation。只需使用IQGraphicsLineItem实例构建UndirectedEdge即可将相应的调用委派给。