C++ 在派生类中实现虚方法的问题

C++ 在派生类中实现虚方法的问题,c++,inheritance,virtual,C++,Inheritance,Virtual,嘿,我正试图使用MVS2010编译器继承一个纯虚拟函数。因此,我可以为所有可渲染对象运行绘制 这是图表 ASCII码 |Renderable | |Entity | |virtual bool draw()=0;| | functions in here | is - a is - a Shape 看来它不会让我继承纯虚函数?并实现了虚拟功能。这是我的密码 // Rendera

嘿,我正试图使用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()
 {
 }

我尝试了多种方法,但谷歌搜索也不起作用。

您的返回类型不匹配。
Renderable::Draw
返回
bool
,而您
Shapes::Draw
返回
void
。整个函数签名(包括返回类型)必须匹配,否则派生类中的函数只会隐藏基类中的函数。

您需要声明Draw in Shapes:

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

仅在以后定义它是不够的。

首先,需要在Shapes类中再次声明draw函数。然后确保它与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()
{
}

实际上,返回类型不需要精确匹配,协变类型的规则是宽松的。@WinterGreen:您能发布一个完整的、可执行的示例来演示什么不起作用吗?我想您的意思是//shapes.cpp bool shapes::Draw(){}而不是//shapes.cpp virtual bool shapes::Draw(){}它现在可以工作了,但为什么我必须声明它,这似乎有点傻它应该有一个从它继承的类的引用。@WinterGreen但是你通过在末尾指定=0将方法Draw声明为纯虚拟,这意味着你强制任何继承类定义该方法。哎呀!方法定义中不应使用虚拟关键字。更正它。感谢这工作,但因为可渲染是虚拟虚空绘制()=0;我只需要在课堂上重新定义它。