2011-09-26 20 views
-1
#include <iostream> 
using namespace std; 
typedef void (*pFun)(void); 
class A 
{ 
private:  
    int a; 
    int b; 
    virtual void outPrint() 
    { 
     cout << b << endl; 
    } 
public: 
    A() 
    { 
     a = 3;  
     b = 4; 
    } 
}; 

int main() 
{ 
    A obj; 
    cout << *((int*)(&obj)+1) << endl; 
    pFun pFunc;  
    pFunc = (pFun)*((int*)*(int*)(&obj)); 
    pFunc(); 
    system("pause"); 
    return 0; 
} 

私がpFunc()を呼び出すと、結果は4と思うが、実際は乱数です。 私はプログラムをデバッグし、pFuncがoutPrint関数を指していることを確認します。なぜわからないのですか、plz助けてくださいなぜ結果は私の期待通りではありませんか?

+0

どのコンパイラを使用していますか? –

+0

vs2010、それはコンパイラと関係があるかもしれないということですか? – cloud

+0

はい、メンバ変数/メソッドがメモリ内でどのように順序付けられるかは、コンパイラに依存します。 –

答えて

2

オブジェクトobjのアドレスは、定義したタイプの機能のアドレスとして解釈できると思われているようです。

できません。

私は、あなたがなぜこのような前提を持っているのか完全にはわかりません。動的ディスパッチの内部実装については、おそらく想定しています。しかし、あなたが呼び出されることを期待しているA::outPrintを取るか、1つのパラメータ(this、それは明示的に定義されていません)を受け取りますが、typedefはパラメータを仮定しません。したがって、アドレスキャスティングがうまく動作していても、取得するアドレスがメンバ関数のアドレス(最初は伸びています)であっても、呼び出しは正しくありません。

typedef void (*pFun)(A*); 

と働くかもしれない

pFunc(&obj); 

への呼び出し:あなたはへのtypedefを変更した場合は

。しかし、スペックごとの動作は私の理解のためには未定義です。

+0

私はポイントを得ると思う、非常にありがとう – cloud

1

int*に1を加算すると、int[]をトラバースする場合の動作が定義されています。

それ以外の場合は、何が起こるべきかの定義はありません。メンバの最終的なメモリ位置が定義されていないので、実装は定義されています。

コンパイラの詳細ではなく標準を利用する方法で問題を解決してみてください。

また、静的メソッド(オブジェクトなし)として呼び出すこの方法で関数のアドレスを取得する場合は、いくつかの頭痛だけを提供することができます。

0

あなたは何をしようとしているのかよく分かりません。メソッドのアドレスを取得するためにポインタを直接操作しようとしているようですが、それは約6つの理由で非常に悪い考えです。クラスメソッドへのポインタを取得することは可能ですが、オブジェクトにバインドされていないので、注意が必要です。

ポインタとC++クラスの基本的な誤解がありますが、これを修正してから安全に管理することをお勧めします。ほとんどの人は関数ポインタを必要とせず、ほとんど誰もメソッドポインタを必要としません。

+0

私はあなたのアドバイスを与えるために思う、私はそれを覚えています – cloud

0

あなたはさまざまな "未定義の動作"に頼っているので、結果は実行しているコンパイラとプラットフォームによって異なります。

(int型*)& OBJ + 1(より良いあなたが書いた場合((int型*)& OBJ)+1誤解を避けるために)必ずしもbメンバーではありません。メンバー間にパディングがある可能性があります。& objは、&(obj.a)がポリモーフィックオブジェクトであることと同じではない可能性があります(トップにvtableポインタがある可能性があります)。

この場合、*(int*)&objはintとして扱われるvtableアドレスです。これをint*に変換すると(intとポインタのサイズが同じであると仮定して)、最初のvtableエントリ(おそらくoutPrintのアドレス)を指します。したがって、「乱数」です。

関連する問題