5

Visual Studio 2005 Proffesional Edition을 사용하고 있습니다.C++ typeid 연산자

다음 예제에서 SomeClass는 사용중인 타사 DLL 라이브러리에 정의 된 클래스입니다. SomeClass에는 가상 메소드가 있습니다. 유형 연산자 자체가 유형 자체에 적용될 때와 유형 객체에 적용될 때 다른 결과를 제공한다는 것을 알게되었습니다. 이 정상적인 행동입니까, 그렇지 않은 경우 그러한 행동의 원인이 될 수 있습니까?

typeid(SomeClass).raw_name() // the value of this is "[email protected]@" 
typeid(SomeClass).name()   /// "class SomeClass" 

SomeClass obj; 
typeid(obj).raw_name(); // "[email protected]@" 
typeid(obj).name();  // "class TLomeClass" 
+2

가로 세로 비율 0 %. 이것을 대답하지 않을 것입니다. 특히 내가 당신의 질문 중 하나를 이미 알고 있다는 것을 알게 된 후. :-) –

+0

무슨 질문 :) – user152508

+0

내가 조사한 질문이 해결되었습니다 - 귀하의 질문에 가장 도움이되는 대답을 수락하려면 체크 표시를 사용하십시오. –

답변

2

문제의 코드가 문제의 코드와 동일하거나 유사합니까? 이 종류의 다형을인가

조작 typeid는 다형성 객체의 동적 타입을 식별 type_info 객체를 반환한다. 따라서, 예를 들어, 사용자가 실제로 (DerivedBase에서 유래) 형 Derived의 객체에 바인딩 (Base는 다형성) 형 Base &의 기준에 typeid을 적용하면 typeid 의해 반환 type_info 객체에 해당 할 것이다 클래스가 아닌 Derived 클래스입니다. 코드에서 그런 일이 일어날 수 있습니까?

또한 위에서 설명한대로 일부 기능은 MS Visual Studio와 같은 일부 컴파일러에서 완전한 기능을 사용하려면 런타임 유형 정보 (RTTI)를 사용하여 코드를 컴파일해야합니다. 아마 당신이 관찰 한 이상한 효과로 RTTI가 없었을 것입니다.

P. 현재 승인 된 답변과는 달리, typeid은 완전히 완벽하게 표준 인 C++ 기능입니다. 컴파일러 확장이 아닙니다.

+0

네, 맞습니다. 내 예제에서는 파생 클래스 개체를 가리키는 기본 포인터를 반환하는 라이브러리 함수를 사용하고있었습니다. 그러나 함수의 서명은 Base * function()이었고 라이브러리 설명서에서 기본 클래스 apperead를 리프 클래스로, 즉 클래스를 상속하도록 지정된 클래스가 없습니다. 그러나 나는 함수가 실제로 libary 문서에서 말하지 않은 파생 된 클래스를 가리키는 포인터를 반환하고 있었다고 생각합니다. 나는이 말을한다면 : Base baseObj; Base * basePtr = fucntion(); 다음 문은 true입니다. typeof (baseObj)! = typeof (* basePtr) – user152508

1

이 동작은 이유는 on MSDN에 설명되어 있습니다. 이 특별한 경우에 나타나는 특정 동작은 .DLL 공급 업체가 문서화하지 않은 일부 상속 또는 일부 컴파일러 확장 때문일 수 있습니다.

연산자의 동작은 C++ 표준에 의해 정의되지 않았으므로 컴파일러 확장입니다. 당신은 그것의 행동에 의지 할 수 없으며 그것이 판매자가 명시 적으로 문서화하지 않는 한 그것이하는 방식으로하는 일을하는 이유를 알기위한 합리적 기대치를 가질 수 없습니다. 해당 동작이 VS2008에서 변경되었을 수 있으며 VS2003과 다를 수 있습니다. (GCC, ICC 및 기타 여러 컴파일러와 확실히 다릅니다.)

+0

답장을 보내 주셔서 감사합니다.이 도움이 많이 있습니다. 사실, 조사가 끝나자, 특정 클래스에 대해 문서화되지 않은 미래가 있다는 결론을 내 렸습니다. – user152508

+0

죄송합니다 : 무엇? !!! 연산자'typeid'는 C++ 표준에 의해 명확하고 명확하게 정의됩니다. 컴파일러 확장이 아닙니다. – AnT

+0

예, typeid는 표준에서 8 * 정의되어 있지만 * behavior *는 아닙니다. 유일한 명시 적 요구 사항은 다음과 같습니다 :'typename A a1, a2; assert (typeof (a1) == typeof (a2)); "그 이상으로, 독서로 확장 된 것입니다. – greyfade