2017-03-08 8 views
0

次の例では、メンバ関数に関して関数ポインタの呼び出しを理解することは本当に難しいです。私は、コードを知っていただきたいと思いコンパイラで置換されたコードメンバー関数の関数ポインタ

(f.*(FPTR) bp)(0); // This call b() 
(b.*(BPTR) fp)(0); // This call f() 

は(私がobj.Fun(のような関数呼び出しを知っているようには)これらの二つの機能のために、コンパイラによって楽しい(& OBJ)に置き換えられを交換したときに、それらのメンバ関数を呼び出します仮想および非仮想です 誰もが私を理解するのに役立ち、してください

私はもっとこのリンクの説明のように理解したい:?http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

#include <iostream> 

using std::cout; 
using std::endl; 

class Foo 
{ 
public: 
    void f(int i = 0) 
    { 
     cout << "Foo" << endl; 

    } 
}; 

class Bar 
{ 
public: 
    void b(char c = 'b') 
    { 
     cout << "Bar" << endl; 
    } 
}; 


int main() 
{ 
    typedef void (Foo::*FPTR) (int); 
    typedef void (Bar::*BPTR) (char); 

    FPTR fp = &Foo::f; 
    BPTR bp = &Bar::b; 

    Foo f; 
    Bar b; 

    /* 
    * we are casting pointer to non-compatible type here 
    * Code works, but want to know how it is. 
    */ 
    (f.*(FPTR) bp)(0); 
    (b.*(BPTR) fp)(0); 


    return 0; 
} 

おかげ

+3

_これらの2つの関数呼び出しのためにコンパイラによって生成されたコードを知りたいです。And ...あなたはアセンブリにコンパイルすることはできません。 –

+0

アセンブリコードは意味しませんでした。私はファッションに興味がありました。 obj.Fun()はFun(&obj)に置き換えられます –

+3

あなたの無効なキャストはUBを生成します。 – Jarod42

答えて

1

あなたのコードはコンパイラが、何(誤って)を含むをそれが好き何でもできることを意味し、undefined behaviourを表示はそれを行うためのを期待しています。

関連する問題