2011-07-16 59 views
1
class A { } 

class B : public A { } 

std::vector<B*> things; 

void Func1(const std::vector<B*>& Bthings) {} 
void Func2(const std::vector<A*>& Athings) {} 

Func1(things); // ok 
Func2(things); // not ok 

我有類似上面的代碼的一些問題。我有一個指向對象的stl集合,但我不想讓Func2知道這個子類。有沒有一個很好的方法來做到這一點?我知道std::vector<B*>不是std::vector<A*>,但我不認爲這是一個罕見的問題。我能想到的是有2個單獨的A *和B *的列表,這只是看起來不對?stl集合和多態性

回答

2

我不認爲這是一個罕見的問題

這不是一個罕見的問題。解決的辦法是就在雖然角落:

template <typename T> 
void Func2(const std::vector<T*>& Athings) {} 

當然,這可能不是你要找的,但它是最接近的匹配。混合編譯時多態(模板,重載)和運行時多態(函數重寫和類繼承)混合不好。

如果上述情況在您的情況下不可接受,那麼最好的方法是複製整個矢量。

+0

該模板對我來說不是那麼好,但我會去「複製整個矢量」 – DanDan

0

一個解決方案就是讓這些功能成爲會員功能,並使Func2私密。

+0

如果函數屬於不同的庫,這是不可能的。 – DanDan