我不知道这是怎么回事。
我有一个Scene类,该类具有Entities vector ,并允许您从场景中添加和获取Entities:
class Scene {
private:
// -- PRIVATE DATA ------
vector<Entity> entityList;
public:
// -- STRUCTORS ---------
Scene();
// -- PUBLIC METHODS ----
void addEntity(Entity); // Add entity to list
Entity getEntity(int); // Get entity from list
int entityCount();
};
我的Entity类如下(输出用于测试):
class Entity {
public:
virtual void draw() { cout << "No" << endl; };
};
然后,我有一个从Entity继承的Polygon类:
class Polygon: public Entity
{
private:
// -- PRIVATE DATA ------
vector<Point2D> vertexList; // List of vertices
public:
// -- STRUCTORS ---------
Polygon() {}; // Default constructor
Polygon(vector<Point2D>); // Declare polygon by points
// -- PUBLIC METHODS ----
int vertexCount(); // Return number of vertices
void addVertex(Point2D); // Add vertex
void draw() { cout << "Yes" << endl; }; // Draw polygon
// -- ACCESSORS ---------
Point2D getVertex(int); // Return vertex
};
如您所见,它具有一个draw()方法,该方法应该覆盖它从Entity类继承的draw()方法。
但事实并非如此。使用以下代码时:
scene->getEntity(0).draw();
如果实体0是Polygon(或至少应该是Polygon),它将从父方法中打印“No”(好像它不是Polygon,而只是一个Entity)。实际上,似乎没有让我调用Polygon独有的任何方法:
'some method name':不是'Entity'的成员
那么有什么想法吗?
谢谢您的帮助。
更新:
因此,我已经实现了第一个答案中给出的代码,但是我不确定如何将多边形添加到列表中。像这样吗?
const tr1::shared_ptr<Entity>& poly = new Polygon;
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);
我只是不习惯这个shared_ptr业务。
最佳答案
我认为您需要发布您的调用代码,但本质上的问题是这样的。
您有一个具体类 Polygon
派生自另一个具体类 Entity
。您的 addEntity 和 getEntity 函数按值获取并返回 Entity
,因此如果您尝试传入或检索 Entity
,您将仅复制该对象的 Entity
部分(对其进行切片),并且有关该对象派生部分的信息将是丢失的。
此外,您还有 vector
的 Entity
,它是基类对象的 vector ,因此除了对象的基本类型之外,您无法存储任何其他内容。
如果您需要一个混合类型对象的集合,但所有对象都源自 Entity
,您可能需要使用动态创建的对象和某种智能指针,例如 tr1::shared_ptr
或 boost::shared_ptr
。
例如。
class Scene {
private:
// -- PRIVATE DATA ------
vector< std::tr1::shared_ptr<Entity> > entityList;
public:
// -- STRUCTORS ---------
Scene();
// -- PUBLIC METHODS ----
void addEntity( const std::tr1::shared_ptr<Entity>& ); // Add entity to list
const std::tr1::shared_ptr<Entity> getEntity(int); // Get entity from list
int entityCount();
};
编辑
您更新的调用代码基本上是正确的,尽管使用对共享指针的本地常量引用有点模糊。
我可能会选择类似的东西:
std::tr1::shared_ptr<Polygon> poly( new Polygon );
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);
关于C++覆盖方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1230006/