허표의 주소와 허상속 클래스 크기의 계산

허함수 목록은 프로그램이 컴파일할 때 이미 존재한다.
허포인터가 new 대상에 있을 때 생성됩니다. 허포인터의 크기는 허함수의 다소와 관계가 없습니다. 모든 허함수는 허함수 목록에 놓여 있습니다. 허포인터를 통해 찾아보세요!
허함수 목록의 주소가 대상의 첫 번째 주소이다.
typedef  void (*FUN)();
예: father*f=new father;
father ff;
만약father에 허함수가 있다면;
허함수 목록의 주소는 다음과 같습니다.
*(int *)*(int *)f; 혹은
*(int *)*(int *)(&ff) 
이것이 바로 허함수 목록의 첫 번째 주소이다.
순서대로 꺼내면:
FUN a= (FUN)(*((int *)*(int *)f+1);//두 번째 허함수의 주소;
호출: a();
또는
FUN b=(FUN)(*((int *)*(int *)(&ff)+2);//세 번째 허함수의 주소;
호출: b();
가상 상속 크기 계산:
예1:
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A    //3+ ==8, ;
{
	char k[3];
public:
	virtual void aa(){};
};

class B : public  A  //k3+j3+ ( )=12;
{
	char j[3];
public:
	virtual void bb(){};
};
class C : public  B  //k3+j3+i3+ ( )=16;
{
	char i[3];
public:
	virtual void cc(){};
};
int main(int arge,char *argv[])
{
	cout<<"sizeof(A):"<<sizeof(A)<<endl;  //8
	cout<<"sizeof(B):"<<sizeof(B)<<endl;  //12
	cout<<"sizeof(C):"<<sizeof(C)<<endl;  //16

	system("pause");
	return 0;
}

예2:
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespacestd;
class A    //3+ ==8, ;
{
       char k[3];
public:
       virtual void aa(){};
};
 
// new ;
class B : public virtual A  //k3+j3+ + ( )=12+4;
{
       char j[3];
public:
       virtual void aa(){};
};
class C : public virtual B  //k3+j3+i3+ + A + B ( )=16+8;
{
       char i[3];
public:
       virtual void aa(){};
};

int main(int arge,char *argv[])
{
       cout<<"sizeof(A):"<<sizeof(A)<<endl;  //8
       cout<<"sizeof(B):"<<sizeof(B)<<endl;  //16
       cout<<"sizeof(C):"<<sizeof(C)<<endl;  //24
 
       system("pause");
       return 0;
}

예삼
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A
{
	char k[3];
public:
	virtual void aa(){};
};
class B : public virtual A
{
	char j[3];
public:
	virtual void bb(){};

};
class C : public virtual B
{
	char i[3];
public:
	virtual void bb(){};  // , ;
	virtual void aa(){};  // ;
};
int main(int arge,char *argv[])
{
	cout<<"sizeof(A):"<<sizeof(A)<<endl;    //8
	cout<<"sizeof(B):"<<sizeof(B)<<endl;	//20
	cout<<"sizeof(C):"<<sizeof(C)<<endl;	//28
	system("pause");
	return 0;
}

허상속과 허함수가 있을 때는 자신이라는 클래스에 새로운 허함수가 있는지 없는지를 봐야 한다. 허함수 목록을 가리키는 바늘이 하나 더 있다!!!

좋은 웹페이지 즐겨찾기