2013-08-09 2 views
7

typeid 기능을 올바르게 사용할 수 없습니다. 나는 뭔가를 놓치고 있습니까유형 ID가 올바르게 작동하지 않습니다.

코드 :

class A 
{ 
    public: 
    int a1; 
    A() 
    { 
    } 
}; 


class B: public A 
{ 
    public: 
    int b1; 
    B() 
    { 
    } 
}; 


int main() 
{ 
    B tempb; 
    A tempa; 
    A * ptempa; 
    ptempa = &tempb; 

    std::cout << typeid(tempb).name() << std::endl; 
    std::cout << typeid(tempa).name() << std::endl; 
    std::cout << typeid(*ptempa).name() << std::endl; 

    return 0; 
} 

그것은 항상 인쇄 :

클래스 B 클래스 A 클래스 A

내 프로젝트에 대한 VS2010를 사용하고

+0

이것은 Clang 4.2를 사용하여 동일하게 동작합니다. 나는 그것이 틀리게 본 것을 동의한다.문서 정의에서 typeid는 포인터의 유형이 아닌 포인터가 가리키는 유형을 제공합니다. 미안하지만 그건 도움이 안돼. 도덕적 지원 ... –

답변

9

예상대로 작동하려면 해당 개체가 다형성이어야합니다. A이 인 가상 소멸자를 추가하는 것과 같이 예상보다 코드가 작동하는 것보다 virtual 메서드가있는 경우. 유형 ID는 그 입력 한 다형성 클래스 타입 (10.3) 인 glvalue 식에 적용하면

이 결과가 참조 :

견적 2을 말한다 C++ draft standard5.2.8유형 식별을 단락 형성 성병 :: 오브젝트있는 type_info 가장 유래 오브젝트의 종류 (180)를 나타내는가 [...]

이 적용되는 우리가 virtual 방법을 가지고있는 경우에, 당신의 경우에 당신이 다형성 유형을하지 않아도 제 이 적용

유형 ID가 다형 클래스 형식의 glvalue 이외의 표현에 적용되는

결과는 표준을 말한다 : 그래서 당신은 Astatic 형 다시 얻을 것이다 발현

의 정적 인 형태를 나타내는 객체 있는 type_info.

가상 함수는 동적 바인딩과 객체 지향 프로그래밍을 지원합니다

그냥 10.3 가상 기능 말한다 좀 더 완전한 부분이 될 수 있습니다. 가상 함수를 선언하거나 상속하는 클래스는 다형 클래스라는 입니다.

20

문제는 A에 가상 함수가 없으므로 다형성으로 처리되지 않는다는 것입니다. 유형. 결과적으로 typeid은 포인터가 가리키는 객체의 실제 유형이 아니라 포인터의 선언 된 유형을 조회합니다.

+0

Ahham. 알아 둘만한! (그리고 당신이 옳았는데,'dynamic_cast <>'도 컴파일되지 않습니다. –

+0

적어도 계승 된 모든 클래스는 dtor 가상을 가져야합니다. 그래서 OP의 설계가 부정확 할 것입니다. – KitsuneYMG

+0

@KitsuneYMG -'std :: iterator'는 가상 소멸자로부터 파생되도록 설계되었고 가상 소멸자가 없습니다. 그게 꼭 있어야합니다. –

0

잔디를 깍는 동안 그것에 대해 생각하면 ... 포인터는 가리키는 대상의 유형을 알 수 없습니다. 형식 정보는 포인터와 함께 저장되며 파생 클래스 (B)를 가리켜도 변경되지 않습니다. 따라서 포인터의 유형을 변경하려면 유형 변환이 필요하고 예상대로 출력 IS가 필요합니다.

관련 문제