2009-09-18 50 views
8

Shape.hC++重写方法没有得到所谓的

namespace Graphics { 
class Shape { 
public: 
    virtual void Render(Point point) {}; 
}; 
} 

Rect.h

namespace Graphics { 

    class Rect : public Shape { 

    public: 

     Rect(float x, float y); 
     Rect(); 

     void setSize(float x, float y); 

     virtual void Render(Point point); 


    private: 

     float sizeX; 
     float sizeY; 

    }; 

} 

struct ShapePointPair { 
    Shape shape; 
    Point location; 
}; 

像这样来使用:

std::vector<Graphics::ShapePointPair> theShapes = theSurface.getList(); 

for(int i = 0; i < theShapes.size(); i++) { 

    theShapes[i].shape.Render(theShapes[i].location); 

} 

该代码最终调用形状::渲染和不是矩形::渲染

我假设这是因为它将Rect塑造成Shape,但我不知道如何阻止它这样做。我试图让每个形状通过重写Render方法来控制它的渲染方式。

有关如何实现此目的的任何想法?

+0

也许你想向我们展示的是创建矢量元素的代码? – 2009-09-18 11:45:56

+1

问题和解决方案几乎与此问题相同http://stackoverflow.com/questions/1230006/问题。在那里,你有一个(struct包含一个)具体基类的向量,如果你期望Rect :: Render被调用,那么你必须通过* slicing *派生类来创建它。 – 2009-09-18 11:53:27

回答

19

这是你的问题:

struct ShapePointPair { 
     Shape shape; 
     Point location; 
}; 

您存储Shape。你应该存储一个Shape *shared_ptr<Shape>或其他东西。但不是Shape; C++不是Java。

当分配RectShape,只有Shape部分被复制(这是对象切片)。

+0

因为ShapePointPair被复制到矢量 – Mark 2009-09-18 11:50:33

+0

@Mark:注意到,ta,auto_ptr会丢失数据。 – dave4420 2009-09-18 11:51:58

+1

谢谢。我一直希望没有指针就能做到这一点,因为这些形状没有使用太多的内存,所以很容易在堆栈中复制,但似乎这是不可能的。感谢所有的快速回复。 – 2009-09-18 11:59:38

1

多态性将只从一个指针到工作的形状,而不是从一个形状对象。

3

这个问题被称为切片 - 复制到基地当你失去的衍生功能。 为了避免这种使用指针的基类,即

std::vector<Graphics::Shape*> s; 
s.push_back(&some_rect); 
+0

谢谢。我以前没有听说过切片,下次会记住这一点。 – 2009-09-18 12:00:41

2

的问题是,在您的载体要存储形状对象的副本,并复制一个形状对象不复制其派生类的数据或功能 - 你的多态性就是slicing

使用新的管理对象和删除,并安排您的矢量的指针存储到他们。

1

您直接访问图形对象的覆盖工作,你需要通过指针或引用访问对象。

例如,当您assigne造型融入ShapePointPair代码将“片”的对象,只有形状位复制到ShapePointPair

这样做,这将意味着你必须注意内存管理 - 所以你可以使用一个智能指针在结构中 ShapePointPair {0}智能指针形状; 点位置; };

0

不,它不是铸造。

可以代替存储参照基类点:

struct ShapePointPair { 
     Shape shape; 
     Point &location; 
}; 

此引用必须在施工时设置的结构 ShapePointPair。为这个 目的添加一个构造函数给ShapePointPair。它必须通过(新创建) Rect的实例。

还观察内存管理责任(正确的 书面析构函数等)。