나는이 작업을 명시 적으로 수행 할 방법이 없다고 확신하지만, 더 나은 방법이있을 경우를 대비하여 질문하고 싶습니다. 나는 기본 클래스 A와 파생 클래스 B를 가지고 있습니다. 이제는 B *를 가리키는 A * 목록을 가지고 있고이 A * 목록을 std :: B 벡터에 복사하려고합니다. * '의 그래서 기본적으로 나는이 작업을 수행 할 수 :C++ std :: 파생 클래스로 타입 캐스트가 가능한 복사가 가능합니까?
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec = std::vector<B*>(aList.begin(), aList.end());
내가 목록과 벡터는 같은 종류의 것이다 때 컴파일해야 확신합니다 (예 : 모두 A * 있었다의)하지만,이에 있기 때문에
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);
}
내 두 번째 방법 또는 것보다 더 우아한 방법이 있나요 : 내가 명시 적으로 다음과 같은 예를 들어 캐스트해야하기 때문에 경우 A *, 나는 이런 식으로 할 수없는 B의 *의 기본 클래스입니다 나는 그렇게해야만 해?
을, dynamic_cast는이다 static_cast보다 안전합니다. static_cast는 B *가 아니더라도 B *를 제공하지만 dynamic_cast는 널 포인터를 제공합니다. 두 경우 모두 A *가 B를 가리 키지 않으면 B로 처리하면 정의되지 않은 동작이 발생하지만 dynamic_cast 버전에서는 적어도 B가 아닌지 알 수 있습니다. –
@David Thornley : ... "A"가 적어도 하나의 가상 함수를 가지고있는 한. –
@Charles : 고마워요. 잘 잡으세요. –