2013-12-18 69 views
0

我想知道是否有任何問題,當派生一個類有一個STL容器,但模板參數是不同的。換句話說:不同的模板參數的繼承

基類:

class GridCell { 
    //.... 
    std::vector<Coord> getNeighbours(const int * coord); 
    //.... 
} 

派生類:與getNeighbours功能

class GridCell2D { 
    //.... 
    std::vector<Coord2D> getNeighbours(const int * coord); 
    //.... 
} 

class GridCell3D { 
    //.... 
    std::vector<Coord3D> getNeighbours(const int * coord); 
    //.... 
} 

意志多態性正常工作?謝謝!

+2

不會。這隻會導致編譯錯誤(假設您使原來的'虛擬'並使事情相互繼承)。 http://ideone.com/pmddOe。 –

+0

這三個類是不相關的類型。這裏沒有多態性。是否打算從'GridCell'派生'GridCell2D'和'GridCell3D'? –

+0

只要返回類型是協變的。 –

回答

1

不,這不行。

如果參數列表具有相同的類型,則只能繼承函數。是的,在你的情況。

但是返回類型也必須關聯。通常他們應該是相同的類型,但相關類型允許的。鬆散地說,類型是相關的如果它們是同一繼承層次的一部分。但這不是這種情況。

請注意,要啓動繼承,您需要標記基類virtual中的函數。

+0

不啓動繼承,而是啓動多態。正如所寫的,繼承不是問題。當'GridCell :: getNeighbours'被標記爲'virtual'時,你會遇到返回類型不匹配的問題。 –

+0

那麼,在我的情況下,參數類(Coord2D,Coord3D等)可以從Coord繼承。那麼這項工作呢? 對不起,我忘了基類GridCell中的虛擬。 這樣做的問題是我無法找到更好,更高效的類設計:S –