Jestem prawie pewien, że nie ma sposobu, aby zrobić to wyraźnie, ale chciałbym zapytać, czy nie ma na to lepszego sposobu. Mam klasę podstawową A i pochodną klasy B, teraz mam std :: listę A *, która wskazuje na B * i chcę skopiować tę listę A * do std :: wektor B * „s więc zasadniczo chcę, aby to zrobić:C++ std :: copy z typem rzutowania na klasę pochodną możliwą?
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec = std::vector<B*>(aList.begin(), aList.end());
Jestem całkiem pewien, że to powinien skompilować gdy lista, a wektor byłoby tego samego typu (np obaj a *” s), ale ponieważ w tym przypadek A * jest klasą bazową B * nie mogę zrobić to w ten sposób, bo musiałbym wyraźnie typecast na przykład tak:
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec;
bVec.reserve(aList.size());
std::list<A*>::iterator it = aList.begin();
for(it; it!=aList.end(); ++it)
{
B* b = static_cast<B*>(*it);
bVec.push_back(b);
}
Czy istnieje bardziej elegancki sposób niż moje drugie podejście czy będzie Muszę to zrobić?
W tym celu dynamic_cast jest bezpieczniejsze niż static_cast. static_cast da ci B * nawet jeśli nie jest B *, a dynamic_cast da ci zerowy wskaźnik. W obu przypadkach, jeśli A * nie wskazuje na B, otrzymujesz niezdefiniowane zachowanie, jeśli traktujesz je jako B, ale w wersji dynamic_cast możesz przynajmniej powiedzieć, czy to nie jest B. –
@ David Thornley : ... o ile 'A' ma co najmniej jedną funkcję wirtualną. –
@Charles: Dzięki - dobry połów. –