/*---------------------------------------------------------------------------* Project: NintendoWare File: main.cpp Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ //------------------------------------------------------------------ // デモ: RuntimeTypeInfo // // 概要 // クラスに実行時型情報を埋め込み安全なダウンキャストをおこなうサンプルです。 // Baseクラスのポインタが指しているAAAクラス、BBBクラス、CCC_AAAクラスの // オブジェクトへのインスタンスを安全に派生クラスにキャストします。 // // シリアル経由でのデバッグ出力のみのサンプルです。 // //------------------------------------------------------------------ #include #include #include // クラスBase class Base { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm Base\n"); } }; // クラスAAA class AAA : public Base { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm AAA\n"); } void FuncAAA() { OS_Printf("do FuncAAA\n"); } }; // クラスBBB class BBB : public Base { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm BBB\n"); } void FuncBBB() { OS_Printf("do FuncBBB\n"); } }; // クラスCCC class CCC_AAA : public AAA { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm CCC\n"); } void FuncCCC() { OS_Printf("do FuncCCC\n"); } }; // 実行時型情報の実体を定義します。 NW_UT_RUNTIME_TYPEINFO_ROOT_DEFINITION( Base ); NW_UT_RUNTIME_TYPEINFO_DEFINITION( AAA, Base ); NW_UT_RUNTIME_TYPEINFO_DEFINITION( BBB, Base ); NW_UT_RUNTIME_TYPEINFO_DEFINITION( CCC_AAA, AAA ); /*---------------------------------------------------------------------------* Name: ObjTest Description: オブジェクトのダウンキャストのテスト関数。 クラスAAA, BBB, CCC_AAAへのダウンキャストを試みて キャストに成功した場合には派生クラスのメソッドを実行します。 Arguments: obj Baseの派生オブジェクトへのポインタ Returns: None. *---------------------------------------------------------------------------*/ static void ObjTest( Base* obj ) { AAA* pAAA; BBB* pBBB; CCC_AAA* pCCC; OS_Printf("-----------------------------\n"); obj->Print(); // クラスAAAにキャスト pAAA = nw::ut::DynamicCast( obj ); if ( pAAA ) { pAAA->FuncAAA(); } else { OS_Printf("Can't cast to AAA\n"); } // クラスBBBにキャスト pBBB = nw::ut::DynamicCast( obj ); if ( pBBB ) { pBBB->FuncBBB(); } else { OS_Printf("Can't cast to BBB\n"); } // クラスCCC_AAAにキャスト pCCC = nw::ut::DynamicCast( obj ); if ( pCCC ) { pCCC->FuncCCC(); } else { OS_Printf("Can't cast to CCC\n"); } } /*---------------------------------------------------------------------------* Name: main Description: サンプルのメイン関数です。 Arguments: なし。 Returns: なし。 *---------------------------------------------------------------------------*/ void nnMain( void ) { OS_Init(); Base obj1; AAA obj2; BBB obj3; CCC_AAA obj4; ObjTest( &obj1 ); ObjTest( &obj2 ); ObjTest( &obj3 ); ObjTest( &obj4 ); OS_Exit(0); }