C++ C++;覆盖方法

C++ C++;覆盖方法,c++,class,inheritance,methods,overriding,C++,Class,Inheritance,Methods,Overriding,我不知道这是怎么回事 我有一个场景类,它有一个实体向量,允许您从场景中添加和获取实体: class Scene { private: // -- PRIVATE DATA ------ vector<Entity> entityList; public: // -- STRUCTORS --------- Scene(); // -- PUBLIC METHODS ----

我不知道这是怎么回事

我有一个场景类,它有一个实体向量,允许您从场景中添加和获取实体:

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();
};
如果实体0是多边形(或至少应该是),它将从父方法打印“否”(好像它不是多边形,只是一个实体)。事实上,它似乎不允许我调用多边形特有的任何方法,而不会得到:

“某些方法名称”:不是“实体”的成员

你知道怎么回事吗

谢谢你的帮助

更新:

因此,我已经实现了第一个答案中给出的代码,但我不确定如何将多边形添加到列表中。像这样的

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);
consttr1::shared\ptr&poly=新多边形;
多边形->添加顶点(点2D(100100));
多边形->添加顶点(点2D(100200));
多边形->添加顶点(点2D(200200));
多边形->添加顶点(点2D(200100));
场景->加法(多边形);

我只是不习惯这种共享业务。

我认为您需要发布您的呼叫代码,但本质上的问题是这一点

您有一个从另一个具体类
实体
派生的具体类
多边形
。addEntity和getEntity函数按值获取并返回一个
实体
,因此,如果您尝试传入或检索一个
实体
,您将只复制该对象的
实体
部分(对其进行切片),有关该对象派生部分的信息将丢失

此外,您还有一个
实体
向量
,它是基类对象的向量,因此除了对象的基本类型之外,您无法存储任何内容

如果需要一个混合类型的对象集合,但所有对象都来自
实体
,则可能需要使用动态创建的对象和某种智能指针,例如
tr1::shared_ptr
boost::shared_ptr

例如

课堂场景{
私人:
//--私有数据------
vectorentityList;
公众:
//--结构---------
场景();
//--公共方法----
void addEntity(const std::tr1::shared_ptr&);//将实体添加到列表
const std::tr1::shared_ptr getEntity(int);//从列表中获取实体
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);
std::tr1::shared_ptr poly(新多边形);
多边形->添加顶点(点2D(100100));
多边形->添加顶点(点2D(100200));
多边形->添加顶点(点2D(200200));
多边形->添加顶点(点2D(200100));
场景->加法(多边形);

chollida的评论是正确的:您正在将多边形类型的对象推送到实体类型的内存位置,并运行所谓的切片。额外的“多边形”信息被切掉,剩下的就是实体

在这些情况下,您应该存储指向基类的指针(或引用,如果可能)。

您应该首先存储指向实体实例的指针(最好是智能指针:)。向量在插入时进行重新分配,以便在调用getter方法之前就将对象切片


getter方法的返回类型也应该是指针或引用,这样您就可以进行polimorphic调用。

对此,您应该使用纯虚函数

class Entity
{
public:
    virtual void draw() = 0;
};

然后从对象调用draw函数,还应该使用指向对象的指针。

根据经验,在处理要以多态方式使用的对象时,应该始终使用引用语义(即通过指针或引用访问对象),而不是值语义


为了以这种方式确保安全,明智的做法是通过创建私有复制构造函数和赋值运算符来创建所有多态类型的基类。这将有效地防止切片,因为如果错误地使用了值语义,代码将无法编译。

尝试在场景类中存储指向实体的指针,而不是实体对象的副本。或者更形象地说,发布的代码将获取多边形并将其放入实体大小的框中,现在的问题是addVertex()对于多边形是唯一的:错误C2039:“addVertex”:不是“实体”的成员,谢谢您的帮助。(对不起,我不确定我是否应该在评论中发布这些额外的问题)编辑,很好。在将多边形添加到场景之前,您应该能够在本地使用共享的_ptr来创建多边形。它应该隐式地转换为共享的\u ptr to实体。我已经进行了适当的编辑。这种行为在C++中称为切片:>您应该使用纯虚拟函数来完成此操作。不一定。实体类当然可以有一个具体的draw方法。
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);
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);
class Entity
{
public:
    virtual void draw() = 0;
};