Share via


ランタイム クラス情報へのアクセス方法

この技術情報では、実行時にオブジェクトのクラスについての情報にアクセスする方法について説明します。

[!メモ]

MFC は、 Visual C++ 4.0 で導入された 実行時の型情報 () RTTI サポートを使用しません。

CObject からクラスを派生し、技術情報 CObject から派生するクラスを作成します。DECLAREにはダイナミックIMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE、またはで説明する DECLARE_SERIALIMPLEMENT_SERIAL のマクロを使用する場合は、 CObject のクラスには、実行時にオブジェクトの厳密のクラスを決定する機能があります。

この機能は、関数の引数の余分な型チェックが必要な場合、次にオブジェクトのクラスに基づいて特定オブジェクト コードを記述する必要がある場合に特に役立ちます。ただし、この推奨事項は通常、仮想関数の機能を複製するために、お勧めできません。

CObject のメンバー関数 IsKindOf を使用できます。特定のオブジェクトが指定されたクラスに属するかどうかを判断するために特定のクラスから派生している場合。IsKindOf への引数は、クラス名の RUNTIME_CLASS マクロを使用して取得できる CRuntimeClass のオブジェクトです。

RUNTIME_CLASS マクロを使用するには

  • クラス CObjectのために次に示すように、クラス名の RUNTIME_CLASS を使用する:

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );   
    

まれにランタイム クラスのオブジェクトに直接アクセスする必要はありません。より多くの一般的な用途は、次の手順に示すように IsKindOf 関数へのランタイム クラス オブジェクトを渡すことです。IsKindOf の関数テスト特定のクラスに属するかどうかを確認するオブジェクト。

IsKindOf の関数を使用する

  1. クラスにランタイム クラスをサポートすることを確認します。つまり、クラスは CObject から直接または間接的に派生している必要があり、技術情報 CObject から派生するクラスを作成します。DECLAREにはダイナミックIMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE、またはで説明する DECLARE_SERIALIMPLEMENT_SERIAL のマクロを使用します。

  2. 次に示すように CRuntimeClass の引数を、生成する RUNTIME_CLASS マクロを使用してそのクラスのオブジェクトの IsKindOf のメンバー関数を、ダイヤル:

    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 Class の複数の継承を必要に応じて使用できますが、多重継承または仮想基本クラスをサポートしません。

ランタイム クラス情報の 1 とおりの使用はオブジェクトの動的生成にあります。このプロセスは技術情報 動的オブジェクトの作成で説明します。

シリアル化、およびランタイム クラス情報の詳細の詳細については、技術情報 MFC のファイル追加を参照してください。

参照

概念

CObject の使い方