Полагаю, вы уже пытались создать метод, подобный
void doSomething(std::vector<A*>& things)
{
}
, и пытались выполнить pass
std::vector<B*> bList = ...;
doSomething(bList);
правильно?
Почему компилятор жалуется?Потому что это не имеет смысла.Учтите, что doSomething () пытается сделать
things.push_back(new C());
Это не может работать, поскольку "вещи" на самом деле std::vector<B*>
.Однако, если бы это было std::vector<A*>
, push_back сработал бы.
Так, что мы можем извлечь из этого?То, что вы пытаетесь использовать, имеет смысл, только если вы читаете только из вектора, однако вектор не является контейнером только для чтения.
Простая оболочка показывает возможное решение (конечно, оболочку можно настроить в соответствии с вашими потребностями).Однако я должен отметить, что использование виртуальных методов может привести к снижению производительности.
class A {};
class B : public A {};
template <class Base>
class AbstractVectorWrapper
{
public:
virtual size_t size() const = 0;
virtual Base* getElementAt(int index) const = 0;
};
template <class Base, class Derived>
class VectorWrapper : public AbstractVectorWrapper<Base>
{
private:
std::vector<Derived*> m_vector;
public:
explicit VectorWrapper(std::vector<Derived*> const& vector)
: m_vector(vector)
{
}
virtual size_t size() const
{
return m_vector.size();
}
virtual Base* getElementAt(int index) const
{
return m_vector[index];
}
};
void doSomething(AbstractVectorWrapper<A> const& wrapper)
{
for (size_t i=0;i<wrapper.size();i++)
{
A* a = wrapper.getElementAt(i);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<A*> as;
std::vector<B*> bs;
doSomething(VectorWrapper<A,B>(bs));
doSomething(VectorWrapper<A,A>(as));
return 0;
}