2013-04-21 4 views
7

나는 부모 클래스 인 추상 기본 클래스와 Child1과 Child2 하위 클래스가 있다고 가정합니다. 부모 *를 사용하는 함수가 있다면 런타임에 함수가 실제로 수신 한 Child1 * 또는 Child2 *인지 여부를 결정하는 방법 (RTTI 포함)이 있습니까?기본 클래스에 대한 포인터가있는 하위 클래스를 식별합니까?

foo가 Parent 일 때 typeid (foo)는 foo가 속한 하위 클래스에 관계없이 typeid (Parent *)를 반환합니다.

+2

'부모 *'는 항상 '부모 *'입니다. 결코 * Child *가 아닙니다. 당신이 묻는 것은 "그것이 가리키는 것의 유형은 무엇입니까"입니다. –

+0

Kerrek SB : 어제 차가운 어깨를 줬어.하지만 실제 프로그래밍을하다가 너의 의견이 페이지의 다른 어떤 것보다 더 중요했을거야. 죄송합니다 ... – ExOttoyuhr

답변

5

하는 당신은 역 참조 포인터가 아닌 포인터 자체의 유형 ID 볼 필요가; 즉, typeid (* foo)가 아닌 typeid (foo)입니다. 참조 해제 된 포인터에 대해 묻는 것은 동적 유형을 얻습니다. 포인터 자체에 대해 묻는 것은 관찰 한 것처럼 정적 유형을 얻는다.

+0

많은 서브 클래스 포인터를 작성하는 것보다 찾고자했던 것보다 더 정확하게 들린다. – ExOttoyuhr

+0

'typeid (* foo)'는 올바른 런타임 유형 (예 : 부모 클래스에 적어도 하나의 가상 메소드가있는 경우에는 'Parent'대신 'Child1'을 사용합니다. – ApproachingDarknessFish

2

물론 :

BaseClass *bptr = // whatever, pointer to base class 
SubclassOne *safe_ptr_one = dynamic_cast<SubclassOne *>(bptr); 
if (safe_ptr_one != nullptr) { 
    // Instance of SubclassOne 
} else { 
    // not an instance of SubclassOne, try the other one 
    SubclassTwo *safe_ptr_two = dynamic_cast<SubclassTwo *>(bptr); 
    if (safe_ptr_two != nullptr) { 
     // Instance of SubclassTwo 
    } else { 
     // it wasn't either one :'(
    } 
} 
+0

니스 - 나는 dynamic_cast가 그것을 할 수 있는지 몰랐습니다! (하지만 그 이유는 내가 물었습니다.) – ExOttoyuhr

+0

@ExOttoyuhr 여러분을 환영합니다. 그리고 예, 저는 앤디 프록 (Andy Prowl) 전에 답을 제공해주었습니다! –

5

당신은이에 대한 std::dynamic_cast를 사용할 수 있습니다. 당신이 std::shared_ptr처럼, 스마트 포인터를 사용하는 경우 또한

Parent* ptr = new Child1(); 
if(dynamic_cast<Child1*>(ptr) != nullptr) { 
    // ptr is object of Child1 class 
} else if(dynamic_cast<Child2*>(ptr) != nullptr) { 
    // ptr is object of Child2 class 
} 

,이처럼 확인할 수 있습니다

std::shared_ptr<Parent> ptr(new Child1()); 
if(std::dynamic_pointer_cast<Child1>(ptr) != nullptr) { 
    // ptr is object of Child1 class 
} else if(std::dynamic_pointer_cast<Child2>(ptr) != nullptr) { 
    // ptr is object of Child2 class 
} 
관련 문제