2016-11-14 75 views
0

我试图采用一种叫TileMapView.h对象是不允许

#pragma once 
class TileMapView 
{ 

public: 
    TileMapView(); 
    ~TileMapView(); 
    virtual void computeDrawPosition(const int col, const int row, const int tw, const int th, float &targetx, float &targety) const = 0; 
    virtual void computeMouseMap(int &col, int &row, const int tw, const int th, const int mx, const int my) const = 0; 
    virtual void tileWalking(int &col, int &row, unsigned char direction) const = 0; 

protected: 
    int width, height; 
    int posX, posY, currentX, currentY; 

}; 
抽象类

我已经实现在DiamondMap的.h和.cpp这个抽象类,但是当我实例化一个新的对象,我收到消息:(不允许使用抽象类类型“DiamondMap”的对象:纯虚函数“TileMapView :: computeDrawPosition”没有覆盖)。这发生在三种方法(computeDrawPosition,computeMouseMap,tileWalking)上。

DiamondMap.h

#pragma once 
#include "TileMapView.h" 

class DiamondMap: public TileMapView 
{ 
public: 
    DiamondMap(); 
    ~DiamondMap(); 
    void computeDrawPosition(const int col, const int row, const float tw, const float th, float &targetx, float &targety); 
    void tileWalking(int &col, int &row, unsigned char direction); 
    void computeMouseMap(int &col, int &row, const int tw, const int th, const int mx, const int my); 
    }; 

的main.cpp

#include <Windows.h> 
#include <GL/gl.h> 
#include <GL/glut.h> 
#include "DiamondMap.h" 

TileMapView *view; 
... 
view = new DiamondMap(); 

回答

1

只要你声明的BAS三班纯虚函数,你必须实现它们在派生类中。

在你的榜样

你没有正确地实现它们,因为实施这些要求提供相同的签名(参数个数和参数的类型),但你在你的基类computeDrawPosition没有如()的第三个参数为INT(INT TW),而在导出的你有它作为浮动从而computeDrawPosition在子类中另一个成员函数不执行基之一:

//in base: 
void computeDrawPosition(const int col, const int row, const int tw, const int th, float &targetx, float &targety) const = 0; 

//in derived: 
void computeDrawPosition(const int col, const int row, const float tw, const float th, float &targetx, float &targety){}; 
  • 也你使基座构件函数该恒定,而在导出的不是恒定的。

  • 解决你的问题你的子类接口的样子:

    void computeDrawPosition(const int col, const int row, const int tw, const int th, float &targetx, float &targety) const {} 
    void computeMouseMap(int &col, int &row, const int tw, const int th, const int mx, const int my) const{} 
    void tileWalking(int &col, int &row, unsigned char direction) const{}; 
    
+0

你没有义务添加关键字重写,但深深地看你的基地标题如何这个纯虚函数的签名是在你的派生 – Raindrop7

-1

你会不会标记overriders为const?

此外,在函数原型的钻石类的末尾添加关键字覆盖看到任何错误在编译时

+0

是的,我已经试过这一点,但我收到消息:“无效computeDrawPosition(INT山坳,INT排,浮TW ,float th,float&targetx,float&targety)不会“覆盖”一个基类成员“,这是我尝试覆盖的三个方法。 –

+0

派生类中的函数覆盖需要被标记为Yash,如Yashwanth所提到的。 – MarcD

+1

为什么我得到的选票:( –