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该对象的一部分(切片),并且有关该对象的派生部分的信息将丢失.
此外你有一个vector的Entity,这是基类对象的矢量,所以你没有存储比基础类型的对象以外的任何其他方式.
如果你需要一个混合类型的对象的集合,但都是从中派生出来的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)
| 归档时间: |
|
| 查看次数: |
8708 次 |
| 最近记录: |