2009-09-18 48 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的實例。

還觀察內存管理責任(正確的 書面析構函數等)。