我有以下课程:
#include <string>
#include <stack>
#include <queue>
#include "map.h"
using namespace std;
#ifndef CONTAINER_H_
#define CONTAINER_H_
struct PathContainer {
int x, y;
string path;
};
class Container {
public:
virtual void AddTile(string, FloorTile *) = 0;
virtual void ClearContainer() = 0;
virtual PathContainer *NextTile() = 0;
};
class StackImpl : public Container {
private:
stack<PathContainer> cntr;
public:
StackImpl();
void AddTile(string, NeighborTile *);
void ClearContainer();
PathContainer *NextTile();
};
class QueueImpl : public Container {
private:
queue<PathContainer> cntr;
public:
QueueImpl();
void AddTile(string, NeighborTile *);
void ClearContainer();
PathContainer *NextTile();
};
#endif
Run Code Online (Sandbox Code Playgroud)
当我尝试创建StackImpl或QueueImpl对象时:
Container *cntr;
cntr = new StackImpl();
Run Code Online (Sandbox Code Playgroud)
要么
Container *cntr;
cntr = new QueueImpl();
Run Code Online (Sandbox Code Playgroud)
我在编译时遇到以下错误:
escape.cpp:在函数"INT主(INT,字符**)":escape.cpp:26:错误:无法分配抽象类型"StackImpl" container.h的目的:23:注:由于以下虚拟函数是pure在'StackImpl'中:container.h:18:注意:virtual void Container :: AddTile(std :: string,FloorTile*)
有任何想法吗?
typeid(NeighborTile *) != typeid(FloorTile *).签名不同,因此即使NeighborTile继承,它们也不算作"相同"的方法FloorTile.