我试图使用名为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();
答案 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类的函数原型末尾添加一个关键字覆盖,以查看编译时的任何错误