2013-03-12 109 views
2

我有多重繼承的問題。C++中的多重繼承(Qt示例)

我想要一個類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 + + :-(一些提示,將不勝感激,謝謝

回答

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一個) 。編譯器必須抱怨另一個。

請讓我知道你是否想讓我詳細說明這個解釋 - 我知道它很短!

0

你應該使用delegation。簡單地構造你的UndirectedEdge與IQGraphicsLineItem實例委派適當調用

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 
} 
+0

感謝您的解決方案,但我只是好奇,爲什麼它不工作。我確信它會在C#中完美工作:)我錯過了C++中的繼承關係:-( – bidacek 2013-03-13 00:20:34

+0

編譯器知道IEdge :: boundingRect()和IGraphicsLineItem :: boundingRect()之間的區別......它們不是即使部分簽名拼寫相同,也是如此。 – Bill 2013-03-13 16:35:30