Ich bin mir ziemlich sicher, dass es keinen Weg gibt, dies explizit zu tun, aber ich würde trotzdem fragen, ob es einen besseren Weg gibt. Ich habe eine Basisklasse A und eine abgeleitete Klasse B, jetzt habe ich eine std :: list von A *, die auf B * 's zeigt, und ich möchte diese Liste von A *' s in einen std :: Vektor von B kopieren * 's so im Grunde möchte ich, dies zu tun:C++ Std :: Kopie mit Typ Umwandlung in abgeleitete Klasse möglich?
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec = std::vector<B*>(aList.begin(), aList.end());
ich bin ziemlich sicher, dass diese zusammenstellen sollte, wenn die Liste und der Vektor den gleichen Typ sein würde (zB waren beide A * s), aber in dieser seit Fall A * ist die Basisklasse von B * ich kann es auf diese Weise nicht tun, weil ich ausdrücklich, wie dies zum Beispiel zu typisieren haben würde:
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);
}
gibt es eine elegantere Weise als meinen zweiten Ansatz oder werden Ich muss es so machen?
Zu diesem Zweck dynamic_cast ist sicherer als static_cast. static_cast gibt dir ein B *, auch wenn es kein B * ist, während dir dynamic_cast einen Nullzeiger gibt. In beiden Fällen, wenn das A * nicht auf ein B zeigt, erhalten Sie undefiniertes Verhalten, wenn Sie es als B behandeln, aber in der dynamic_cast-Version können Sie zumindest sagen, ob es kein B. –
@David Thornley ist : ... solange 'A' mindestens eine virtuelle Funktion hat. –
@Charles: Danke - guter Fang. –