다음을 통해 공유


런타임 클래스 정보 액세스

이 문서에서는 런타임에 개체 클래스에 대한 정보에 액세스하는 방법을 설명합니다.

참고 항목

MFC는 Visual C++ 4.0에 도입된 RTTI(런타임 형식 정보) 지원을 사용하지 않습니다.

CObject에서 클래스를 파생하고 DECLARE_DYNAMICIMPLEMENT_DYNAMICCObjectCObject에서 클래스 파생 문서에 설명된 , DECLARE_DYNCREATEIMPLEMENT_DYNCREATEDECLARE_SERIAL 매크로를 IMPLEMENT_SERIAL 사용한 경우 클래스는 런타임에 개체의 정확한 클래스를 확인할 수 있습니다.

이 기능은 함수 인수의 추가 형식 검사 필요한 경우와 개체의 클래스에 따라 특수 용도의 코드를 작성해야 하는 경우에 가장 유용합니다. 그러나 이 방법은 일반적으로 가상 함수의 기능을 복제하므로 권장되지 않습니다.

CObject 멤버 함수 IsKindOf 를 사용하여 특정 개체가 지정된 클래스에 속하는지 또는 특정 클래스에서 파생되었는지 확인할 수 있습니다. 인수 IsKindOfCRuntimeClass 클래스의 이름과 함께 매크로를 RUNTIME_CLASS 사용할 수 있는 개체입니다.

RUNTIME_CLASS 매크로를 사용하려면

  1. 클래스의 경우 다음과 같이 클래스CObject의 이름과 함께 사용합니다RUNTIME_CLASS.

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

런타임 클래스 개체에 직접 액세스할 필요가 거의 없습니다. 더 일반적인 용도는 다음 절차와 같이 런타임 클래스 개체를 IsKindOf 함수에 전달하는 것입니다. 함수는 IsKindOf 개체를 테스트하여 특정 클래스에 속하는지 확인합니다.

IsKindOf 함수를 사용하려면

  1. 클래스에 런타임 클래스 지원이 있는지 확인합니다. 즉, 클래스는 직접 또는 간접적으로 파생되어 DECLARE_DYNAMIC 및 CObject에서 CObject 클래스 파생 문서에 설명된 매크로 DECLARE_DYNCREATE 및 , DECLARE_SERIALIMPLEMENT_DYNCREATEIMPLEMENT_SERIAL 및 매크로를 사용해야 합니다.IMPLEMENT_DYNAMIC

  2. 다음과 같이 매크로를 IsKindOf 사용하여 RUNTIME_CLASS 인수를 생성하여 해당 클래스의 개체에 CRuntimeClass 대한 멤버 함수를 호출합니다.

    class CPerson : public CObject
    {
       DECLARE_DYNAMIC(CPerson)
    
       // other declarations
    };
    

     

    IMPLEMENT_DYNAMIC(CPerson, CObject)
    
    IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)
    
    void MemoryCorruptingSnippet(bool bCorrupt)
    {
       if (bCorrupt)
       {
          CAge *pcage = new CAge(21);  // CAge is derived from CObject.
          Age *page = new Age(22);     // Age is NOT derived from CObject.
          *(((char *)pcage) - 1) = 99; // Corrupt preceding guard byte
          *(((char *)page) - 1) = 99;  // Corrupt preceding guard byte
          AfxCheckMemory();
       }
    }
    
    void SomeFunction(void)
    {
       CObject *pMyObject = new CPerson;
    
       if (NULL != pMyObject &&
           pMyObject->IsKindOf(RUNTIME_CLASS(CPerson)))
       {
          //if IsKindOf is true, then cast is all right
          CPerson *pmyPerson = (CPerson *)pMyObject;
          pmyPerson->AssertValid();
          // other code goes here...
       }
    
       delete pMyObject;
    }
    

    참고 항목

    개체가 지정된 클래스의 멤버이거나 지정된 클래스에서 파생된 클래스의 멤버인 경우 IsKindOf는 TRUE를 반환합니다. IsKindOf 에서는 여러 상속 또는 가상 기본 클래스를 지원하지 않지만 필요한 경우 파생 Microsoft Foundation 클래스에 여러 상속을 사용할 수 있습니다.

런타임 클래스 정보의 한 가지 사용은 개체의 동적 생성에 있습니다. 이 프로세스는 동적 개체 만들기 문서에서 설명합니다.

serialization 및 런타임 클래스 정보에 대한 자세한 내용은 MFC의 파일 및 Serialization 문서를 참조하세요.

참고 항목

CObject 사용