2011-09-23 58 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