기본 클래스에 대한 포인터가 (typeid
을 사용하는) 어떤 유형인지 먼저 확인하면 성능을 저해하기 위해 reinterpret_cast
을 수행하는 것이 유효합니까?typeid 검사가 유효 한 후에 reinterpret_cast를 사용하고 있습니까?
class Base {
virtual ~Base() {}
};
class A : Base {};
class B : Base {};
...
class Z : Base {};
나중에 곳 : 나는 그것을해야 생각하는
지금까지 내가 말할 수있는void fn(Base & msg) {
const auto & tid = typeid(msg);
if (tid == typeid(A)) {
A * ptr = reinterpret_cast<A*>(&msg);
} else if (tid == typeid(B)) {
B * ptr = reinterpret_cast<B*>(&msg);
} ...
...
} else if (tid == typeid(Z)) {
Z * ptr = reinterpret_cast<Z*>(&msg);
}
}
,이 코드는 잘 작동합니다. 그러나 운이 좋았거나 실제로 잘 정의 된 사용법 일 뿐이므로 궁금합니다. 이 방법으로 reinterpret_cast
을 사용하십시오.
그리고 정상적인 다형성을 사용하기 전에 클래스를 변경할 수는 없으므로 클래스를 변경할 수는 없으므로 주위에이 방법을 만들어야합니다.
전체 디자인은 여기 보이는 * 매우 * 깨진. 처음부터 바꿀 수없는 관련 자료를 다시 작성하는 것만으로도 충분히 가치가 있습니다. –
'reinterpret_cast'는 vtable을 고려하지 않습니다. RTTI를 잃고 정의되지 않은 동작을 할 수 있습니다. 그래서 ** 유효하지 않습니다 **. – user1810087
@BaummitAugen은 좋아하지만 다른 팀의 엉망진창을 고치고 있습니다. 슬프게도 예산을 다시 작성합니다 :/ – Paladin