2011-07-16 30 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