C++覆盖方法

扫码查看

我不知道这是怎么回事。

我有一个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 部分(对其进行切片),并且有关该对象派生部分的信息将是丢失的。

此外,您还有 vectorEntity ,它是基类对象的 vector ,因此除了对象的基本类型之外,您无法存储任何其他内容。

如果您需要一个混合类型对象的集合,但所有对象都源自 Entity ,您可能需要使用动态创建的对象和某种智能指针,例如 tr1::shared_ptrboost::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/

10-12 00:30
查看更多