ポインタをキャストすることvoid*
は、C時代からずっと重要です。最も適切な場所は、オペレーティングシステムのメモリマネージャ内です。作成したもののすべてのポインタとオブジェクトを格納する必要があります。それをvoid*に格納することにより、オブジェクトをメモリマネージャのデータ構造に格納するように一般化しheap/B+Tree
ますarraylist
。
簡単にするためにlist
、一般的なアイテムの作成の例を見てください(リストには完全に異なるクラスのアイテムが含まれています)。これは、を使用する場合にのみ可能void*
です。
標準では、dynamic_castは不正な型キャストに対してnullを返す必要があり、標準は、関数ポインターを除いて、すべてのポインターがそれをvoid*に型キャストして元に戻すことができることも保証します。
通常のアプリケーションレベルの実際の使用法は、void*
型キャストでは非常に少ないですが、低レベル/組み込みシステムで広く使用されています。
通常、低レベルのものにはreinterpret_castを使用する必要があります。たとえば、8086では、同じベースのポインターをオフセットしてアドレスを取得するために使用されますが、これに限定されません。
編集:
標準では、任意のポインタをに変換できるとされていますが、オブジェクトに戻すことができないとはどこにも示されていませんvoid*
。dynamic_cast<>
void*
ほとんどの使用法では、一方通行ですが、避けられない使用法がいくつかあります。
dynamic_cast<>
要求されたタイプに戻すには、タイプ情報が必要であるとだけ書かれています。
void*
いくつかのオブジェクトに渡す必要がある多くのAPIがあります。java / Jniコードは、オブジェクトをとして渡しますvoid*
。
タイプ情報がないとキャストできません。要求された型が正しいことを十分に確信している場合は、コンパイラーにdynmaic_cast<>
トリックを実行するように依頼できます。
このコードを見てください:
class Base_Class {public : virtual void dummy() { cout<<"Base\n";} };
class Derived_Class: public Base_Class { int a; public: void dummy() { cout<<"Derived\n";} };
class MostDerivedObject : public Derived_Class {int b; public: void dummy() { cout<<"Most\n";} };
class AnotherMostDerivedObject : public Derived_Class {int c; public: void dummy() { cout<<"AnotherMost\n";} };
int main () {
try {
Base_Class * ptr_a = new Derived_Class;
Base_Class * ptr_b = new MostDerivedObject;
Derived_Class * ptr_c,*ptr_d;
ptr_c = dynamic_cast< Derived_Class *>(ptr_a);
ptr_d = dynamic_cast< Derived_Class *>(ptr_b);
void* testDerived = dynamic_cast<void*>(ptr_c);
void* testMost = dynamic_cast<void*>(ptr_d);
Base_Class* tptrDerived = dynamic_cast<Derived_Class*>(static_cast<Base_Class*>(testDerived));
tptrDerived->dummy();
Base_Class* tptrMost = dynamic_cast<Derived_Class*>(static_cast<Base_Class*>(testMost));
tptrMost->dummy();
//tptrMost = dynamic_cast<AnotherMostDerivedObject*>(static_cast<Base_Class*>(testMost));
//tptrMost->dummy(); //fails
} catch (exception& my_ex) {cout << "Exception: " << my_ex.what();}
system("pause");
return 0;
}
これがまったく正しくない場合は、私を訂正してください。