다중 상속의 멤버함수 포인터
#include <iostream> using namespace std; class A { int a; public: void fa() { cout << "fa : " << this << endl; } }; class B { int b; public: void fb() { cout << "fb : " << this << endl; } }; class C : public A, public B{}; int main() { C c; cout << &c << endl; void (C::*f)(); cout << sizeof(f) << endl; // 8 f = &C::fa; (c.*f)(); f = &C::fb; (c.*f)(); . }
class C는 class A와 class B를 다중 상속받은 클래스이다.
위의 예제에서 C의 멤버함수 포인터를 출력하면 8이 출력됨을 확인할 수 있다.
상속받은 멤버함수의 크기가 8바이트인 이유는
{함수주소, this offset}을 저장할 두개의 주소가 필요하기 때문이다.
상속받은 클래스는 this가 이동되어서 전달되기 때문에 offset을 기록할 필요가 있다.
f = &C::fa의 경우 {fa주소, 0}으로 채워주고,
f = &C::fb; {fb주소, sizeof(A)}로 채워줍니다.
728x90
'Software Development > C, C++' 카테고리의 다른 글
2_new2_예제 (0) | 2014.07.21 |
---|---|
2_new1_new,operator new, operator delete (0) | 2014.07.20 |
1_this3_멤버 변수의 포인터 (0) | 2014.07.20 |
1_this2_함수포인터의 this (0) | 2014.07.20 |
1_ this1 (0) | 2014.07.20 |