抽象类类型的对象" DiamondMap"不被允许

时间:2016-11-14 17:50:51

标签: c++ abstract

我试图使用名为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();

2 个答案:

答案 0 :(得分:1)

只要在bas类中声明三个纯虚函数,就必须在派生类中实现它们。

在您的示例中,您没有正确实现它们,因为实现它们需要提供相同的签名(参数数量和参数类型),但您没有例如在您的基类中computeDrawPosition()具有第三个参数为int(int tw),而在派生时你将它作为float,因此子类中的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){};
  • 您也可以制作基本会员功能&#39;派生的这个常数不是常数。

  • 解决您的子类接口的问题:

    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{};
    

答案 1 :(得分:-1)

您不会将覆盖标记为const ??

还在diamond类的函数原型末尾添加一个关键字覆盖,以查看编译时的任何错误