2011-12-29 8 views
-1

私はC++を学んでいます。メモリダイアグラムのヘルプが必要

次のようなコードが実行されると、フードの下で何が起きているかのような思い出を見たいと思っています。

// dynamic_cast 
    #include <iostream> 
    #include <exception> 
    using namespace std; 

    class CBase { virtual void dummy() {} }; 
    class CDerived: public CBase { int a; }; 

    int main() { 
    try { 
    CBase * pba = new CDerived; 
    CBase * pbb = new CBase; 
    CDerived * pd; 

    pd = dynamic_cast<CDerived*>(pba); 
    if (pd==0) cout << "Null pointer on first type-cast" << endl; 

    pd = dynamic_cast<CDerived*>(pbb); 
    if (pd==0) cout << "Null pointer on second type-cast" << endl; 

    } catch (exception& e) {cout << "Exception: " << e.what();} 
    system("PAUSE"); 
    return 0; 
    } 

誰かが私を助けてくれますか?

+1

あなたは確信している部分はありますか? – John

+1

このような図がどのように見えるかわかりません。あなたは例を挙げることができますか? – cdhowie

+0

もしあなたが最初の4行を描くことができれば..それは私と大丈夫です – user882196

答えて

0

pd = dynamic_cast<CDerived*>(pba);後、状況は次のようになります。

pba ---> [CDerived] 
     ^
pd -------' 

pbb ---> [CBase] 

すなわち、pbaと同じオブジェクトへpdポイント。しかし、彼らは異なった型付けされています。キャストが無効なため

pd = dynamic_cast<CDerived*>(pbb);後、pd0(ヌル)になります。

pba ---> [CDerived] 

pd ----> (null) 

pbb ---> [CBase] 
1

私はあなたの実際の問題が何であるかはかなりよく分からないが、私はそれがどのように> <のdynamic_castについてですと仮定しています()が働きます。実用的な観点からは、それが内部的にどのように実装されているかは問題ではありません。 Stanley Lippmanの著書(「C++ Object Modelの中に」)がありますが、これは少し前ですが、精巧なイメージを形成するためにこれらの詳細を合理的に説明しています。注意すべき重要な点は、dynamic_cast <>()を使用すると、異なるタイプのオブジェクトや小さな調整が表示されるだけでなく、継承ツリーに似たものの内部表現で検索が行われることです。 dynamic_castを(PBA)は概ね次のように動作し、前記

  1. 内蔵型情報へのポインタを取得し(典型的には、「仮想関数ポインタテーブル」または現代実装ドンものの「VTBL」と記しますタイプを識別するバニラ仮想関数ポインタテーブルを使用します)。これを実行するには、dyanmic_castの引数の静的型(この場合はCBase)が少なくとも1つの仮想関数を持つ必要があります。
  2. このオブジェクトのタイプ情報は、システムが(必要に応じて複数の継承を必要とする)ポインタを必要に応じて調整するターゲットタイプと一致する場合があります(例のように)。対応するポインタを返します。そうでない場合、すなわち、ターゲットタイプがオブジェクトの動的タイプの基本クラスである場合、システムは、動的タイプの基本クラスにおいてターゲットタイプを見つけようとする。単一の継承の場合、これはかなり単純ですが、複数の継承が関与している場合は、かなりの検索が必要になります。

つまり、dynamic_cast <を使用すると、プログラムにパフォーマンスの問題が発生する可能性が高まります。ただし、プログラムのクラッシュの可能性を生み出すために必要な場所では使用しないでください。一般に、dynamic_cast <>()を使用する必要性は比較的まれです。あなたがdynamic_cast <>()を使用していることが分かっていると、あなたのデザインにはほとんど間違いがあります。