C++重写方法

Jos*_*eld 7 c++ methods inheritance overriding class

我无法弄清楚这是怎么回事.

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

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();
};
Run Code Online (Sandbox Code Playgroud)

我的实体类如下(输出用于测试):

class Entity {
    public:
        virtual void draw() { cout << "No" << endl; };
};
Run Code Online (Sandbox Code Playgroud)

然后我有一个继承自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
};
Run Code Online (Sandbox Code Playgroud)

如您所见,它有一个draw()方法,它应该覆盖它从Entity类继承的draw()方法.

但事实并非如此.使用以下代码时:

scene->getEntity(0).draw();
Run Code Online (Sandbox Code Playgroud)

其中实体0是多边形(或至少应该是),它从父方法打印"否"(好像它不是多边形,只是一个实体).事实上,似乎没有让我调用Polygon特有的任何方法而不会得到:

' 某个方法名称 ':不是'实体'的成员

那么任何想法是什么了?

谢谢您的帮助.

更新:

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

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);
Run Code Online (Sandbox Code Playgroud)

我只是不习惯这个shared_ptr业务.

CB *_*ley 14

我认为你需要发布你的调用代码,但基本上问题是这个.

你有一个Polygon派生自另一个具体类的具体类Entity.你的addEntity和getEntity函数接受并返回一个Entity by值,所以如果你试图传入或检索一个Entity,你将只复制Entity该对象的一部分(切片),并且有关该对象的派生部分的信息将丢失.

此外你有一个vectorEntity,这是基类对象的矢量,所以你没有存储比基础类型的对象以外的任何其他方式.

如果你需要一个混合类型的对象的集合,但都是从中派生出来的Entity,你可能需要使用动态创建的对象和某种智能指针,如a tr1::shared_ptr或a 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();
};
Run Code Online (Sandbox Code Playgroud)

编辑

您更新的调用代码基本上是正确的,尽管使用对共享指针的本地const引用有点模糊.

我可能会选择以下内容:

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);
Run Code Online (Sandbox Code Playgroud)

  • 或者更加图形化,发布的代码采用Polygon并将其放入实体大小的框中,并不完全适合. (3认同)