2012-05-09 6 views
2

나는 wikipedia에서 RTTI의 예를 살펴 보았습니다.위키 백과의 RTTI 정의에 대해

내가 (

ABC * abc_pointer = 새로운 xyz이이 부분에 대해 혼란 스러워요) abc_pointer는 얻을 것이다 identified.I가

xyz_pointer을 비교의 사용이 무엇을 의미하는 것이 분명 wouldnt가 XYZ 객체를 가리 키도록하게하는 경우

! = NULL

나중에 그리고 일반적으로 RTTI? 내가 여기서 뭔가를 놓치고 있니? 나중에

xyz_pointer = dynamic_cast<xyz*>(abc_pointer); 

xyz로 다시 캐스팅 : 그들이 할 때

+0

그보다 훨씬 일반적인 것입니다. 'abc'는 많은 다른 클래스의 기본 클래스가 될 수 있으며, 런타임 중에 (abc_pointer가 abc_pointer 클래스의 객체를 가리킬 수 있기 때문에) 어떤 타입의 객체를 가리키는 지 반드시 알지 못할 수도 있습니다. RTTI는 'dynamic_cast '(실제로는 RTTI 임)을 사용하여 가리키는 객체의 실제 유형을 결정합니다. – birryree

답변

4

중요한 비트입니다. xyz이 모두 abc이더라도 모든 abcxyzs가되는 것은 아닙니다. 여기에 dynamic_cast에 "만약 이것들 중 하나라면 그것을 던지십시오. 그렇지 않으면 나쁜 일을하는 대신에 멈추고 NULL을주세요"라고 말합니다. dynamic_cast이 RTTI를 사용하고 있습니다.

장난감 예에서 abc*xyz* 인 것을 분명히 알 수 있습니다 (컴파일러도 원하는 경우 알아낼 수 있습니다). 기능 상상해

void (abc *ptr) { 
    if (dynamic_cast<xyz*>(ptr)) { 
    //... 
    } 
    else { 
    //... 
    } 
} 

그 일반적인 예에서 얘기 할 수있는 방법이 없습니다 정확히 dynamic_cast가하는 일입니다 실행시의 형태 정보를보고하지 않고 xyz으로 캐스팅 할 수 있습니다 부여하고 만약에.

static_cast<xyz*>(ptr)을 사용했다는 사실은 사실 합법적이지 않고 정의되지 않은 동작으로 이어질 가능성이있는 경우에도 캐스트가 항상 효과가있는 것처럼 보입니다.

"코드 냄새"를 나타낼 수도있는 if (dynamic_cast<...을 많이 쓰는 사람이 있으면 리팩토링을 고려해야합니다. 아마도 가상 메서드가 더 적절할 것입니다. dynamic_cast 및 RTTI는 C++을 설계 할 때 최후의 수단이어야합니다.