http://minjang.egloos.com/1458391 // 이문제에 대한 좋은 사례.

//
멤버함수 포인터의 크기, 가상함수 일때 크기, 상속이 있을때, 상속이 있을때 가상함수.

// 최대16byte 까지나온다. ??? boost??

 

// 다중상속과가상상속일때크기가달라집니다.

class  A

{

public:

        virtual void foo(int ) {}

};

class B : virtual public A

{

public:

        virtual void foo(int ){}

};

 

typedef void( B::*FUNC )();

 

void main()

{

        // 같은 표현
       
cout << sizeof( &B::foo ) << endl;

        cout << sizeof( FUNC ) << endl;
}

Tag |

// 일반 멤버 함수포인터를 만들 때에는 thiscall을 생각해서 'Point::'를 추가해주자!!
// void(Point::*f3)() = &Point::hoo;

class
Point

{

public:

        //this가인자로전달되지않는멤버함수.

        static void foo( int a )
        { cout << "foo()" << endl; }

        void hoo()

        { cout << "hoo()" << endl; }

};

 

void goo( int a )

{

        cout << "goo()" << endl;
}

 

int main()

{

        void(*f1)(int) = &goo;

        void(*f2)(int) = &Point::foo;

 

        // 일반멤버함수의 주소

        void(Point::*f3)() = &Point::hoo;

 

        //f3(); // 될까? 안된다-> 객체가없다. this를전달해주지못한다.

 

        Point p;

        (p.*f3)();   // ().을 우선으로 연산하고 *를 하여서 함수포인터를 호출!

}

Tag |

// 멤버함수의호출원리

class A

{

        int x;

public:

        void foo( int a )      // void foo( Point* const this, int a)

        {

               x = a;                 // this->x = a;

        }

};

 

void main()

{

        A a1, a2;

        a1.foo(10);  // foo( &a1, 10 );

        // push &a1 이 아니라 mov ecx, &a1
        // a1 , 즉 this
에 대한 인자는 레지스터로 보낸다.( thiscall )

        // push 10

        // call foo

}

Tag |