STL коллекции и полиморфизм - PullRequest
1 голос
/ 16 июля 2011
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 * s и B * s, что кажется неправильным?

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Не думаю, что это редкая проблема

Это не редкая проблема. Решение уже не за горами:

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

Конечно, это, вероятно, не то, что вы искали, но самое близкое совпадение. Смешивание полиморфизма во время компиляции (шаблоны, перегрузка) и полиморфизма во время выполнения (переопределение функций и наследование классов) плохо сочетается.

Если вышесказанное неприемлемо в вашем случае, лучше всего скопировать весь вектор.

0 голосов
/ 16 июля 2011

Одним из решений было бы, чтобы эти функции были функциями-членами и сделали Func2 приватным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...