2012-02-16 14 views
0

私はちょうど何かをしていて、このプログラムを書いていました。私は次の結果を得ました。コンパイル時に変数のバインディングが行われているのに、実行時に関数の解決が行われることはわかっていますが、理解できなかったのは最初の出力です(this->n)。誰も私にこれを説明することはできますか?私が得た仮想関数出力?

# include <iostream> 
    # include <stdio.h> 
    # include <conio.h> 

    using namespace std; 

    class A 
    { 
     int n;  
     public: 
     virtual void Fun1(int no=10) 
     { 
     int n=no;   
     cout<<"A::Fun1() "<<n <<"\n"; 
     } 
    }; 

    class B :public A 
    { 
    int n;  
    public: 
    virtual void Fun1(int no=20) 
    { 
     int n=no;   
     cout<<"B::Fun1() " << this->n << "\n"; // WHY SO ? gives B::Fun1() 40 
     cout<<"B::Fun1() " << n << "\n"; 
    } 
    }; 

    int main() 
    { 
    B b; 
    A &a =b; 
    a.Fun1(); 
    A a1=b; 
    a1.Fun1(); 
    getch(); 
    return 0; 
    } 

出力はthis->nあなたは初期化しませんメンバ変数B::n、を意味し、第一の出力については

B::Fun1() 40 
    B::Fun1() 10 
    A::Fun1() 10  
+5

クラス・データ・メンバーが初期化されていないいます。あなたはそれらから_any_値を得ることができます。 – ildjarn

+0

オブジェクトを 'A a1 = b;'でスライスしています。これは予想される動作です。 –

答えて

5

だった - これは何かを印刷することができます。

2番目の場合、nはローカル変数nを参照します。これは関数の引数で初期化します。既定の引数は呼び出し元によって提供され、Aへの参照を介して関数を呼び出すため、の値ではなく、A::Fun1で指定された既定値が取得されます。あなたがb.Fun1()を呼ぶとしたら、それはB::Fun1() 20を印刷します。

Bオブジェクトを「スライス」して、タイプがAのオブジェクトを与えたので、を呼び出します。

3

メンバー変数B::nはどこにも初期化されていません。あなたは妥当な価値を持っていることは幸いです。それは何でもあったかもしれません。

0

あなたのB :: nは初期化されていません。私はコードを実行するときにこれを取得します。

B :: FUN1()-858993460 B :: FUN1()10 A :: FUN1()10