허표의 주소와 허상속 클래스 크기의 계산
2750 단어 허함수 목록가상 상속 크기 계산
허포인터가 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;
}
허상속과 허함수가 있을 때는 자신이라는 클래스에 새로운 허함수가 있는지 없는지를 봐야 한다. 허함수 목록을 가리키는 바늘이 하나 더 있다!!!