2011-09-23 50 views
0

嘿,我試圖使用MVS2010編譯器多重繼承純虛函數。所以我可以爲所有可渲染對象運行繪製。在派生類中實現虛方法的問題

因此,這裏是圖

在ASCII

|Renderable   | |Entity    | 
|virtual bool draw()=0;| | functions in here | 

    is - a    is - a 


       Shape 

如此看來它不會讓我繼承了純虛函數?並實現虛擬功能。這是我的代碼。

// Renderable.h 
#ifndef H_RENDERABLE_ 
#define H_RENDERABLE_ 
class Renderable 
{ 
public: 
    virtual bool Draw() = 0; 
}; 
#endif 


//Shapes.h 
#ifndef H_SHAPES_ 
#define H_SHAPES_ 
#include "Renderable.h" 
#include "Entity.h" 
class Shapes : public Entity, public Renderable 
{ 
public: 
    Shapes(); 
    ~Shapes(); 

}; 


#endif 

//shapes.cpp 
#include "Shapes.h" 


Shapes::Shapes() 
{ 
} 


Shapes::~Shapes() 
{ 
} 


virtual void Shapes::Draw() 
{ 
} 

我試過多種東西,它也不起作用谷歌搜索。

回答

1

首先,您需要在Shapes類中再次聲明繪圖函數。然後確保它具有與Renderable類中聲明的簽名相同的簽名。

//Shapes.h 
#ifndef H_SHAPES_ 
#define H_SHAPES_ 
#include "Renderable.h" 
#include "Entity.h" 
class Shapes : public Entity, public Renderable 
{ 
public: 
    Shapes(); 
    ~Shapes(); 

    virtual bool Draw(); 

}; 


#endif 

//shapes.cpp 

bool Shapes::Draw() 
{ 
} 
+0

我想你的意思//shapes.cpp 布爾形狀::抽獎(){ } 代替 這 //shapes.cpp的 虛擬BOOL形狀::抽獎(){ } 它 – WinterGreen

+0

工作現在但爲什麼我必須聲明它,這似乎有點愚蠢,它應該從它繼承的類中引用。 – WinterGreen

+0

@WinterGreen但是您通過在末尾指定= 0來聲明方法Draw爲純虛擬,這意味着您強制任何繼承類來定義該方法。 –

0

您的退貨類型不匹配。 Renderable::Draw返回bool,而您Shapes::Draw返回void。整個函數簽名(包括返回類型)必須匹配,否則派生類中的函數只會隱藏基類中的函數。

+0

有效點,但它不工作d: – WinterGreen

+0

實際上返回類型並不需要精確匹配,規則是放鬆的協變類型。 –

+0

@WinterGreen:您能否發佈一個完整的可執行示例來演示哪些功能無效? –

0

你需要的形狀申報抽獎:

class Shapes : public Entity, public Renderable 
{ 
    public: 
    Shapes(); 
    ~Shapes(); 
    virtual void Draw(); 
}; 

後來就定義它是不夠的。

+0

感謝這工作,但 因爲可渲染是虛擬無效Draw()= 0;我只需要在課堂上重新定義它。 – WinterGreen

相關問題