- 论坛徽章:
- 0
|
$ ls -la /usr/bin/g++
lrwxr-xr-x 1 root wheel 12 Mar 17 15:01 /usr/bin/g++ -> llvm-g++-4.2
$ ls
data_size data_size.cpp data_size.cpp.002t.class
$ vim data_size.cpp
public:
void self(){
cout<<"is Y"<<endl;
}
};
class Z : public virtual X {
public:
void bself(){
cout<<"is Z"<<endl;
}
};
class A : public Y, public Z {};
typedef void (*pfun)();
typedef void (Y::*afun)();
int main()
{
X *x=new X();
Y *y=new Y();
A *a=new A();
Z *z=new Z();
//y->self();
A b;
pfun f;
long long *vtable=(long long*)&b;
f=(pfun)(*vtable);
f();
//afun af;
//af = Y::self;
//af();
//-fdump-class-hierarchy
cout<<"sizeof X:"<<sizeof(class X)<<":"<<((void***)x)[0] <<endl;
cout<<"sizeof Y:"<<sizeof(class Y)<<":"<<((void***)y)[0]<<endl;
cout<<"sizeof Z:"<<sizeof(class Z)<<":"<<((void***)z)[0]<<endl;
cout<<"sizeof A:"<<sizeof(class A)<<":"<<((void***)a)[0][2]<<":"<<((void***)a)[0][3]<<endl;
//f = &a->self;
//f();
//f = (pfun)*((int*)*(int*)(&b));
//f();
void ***p = (void***)y;
f = (pfun)(p[0][1]);
f();
f = (pfun)(p[0][2]);
f();
f = (pfun)(p[0][0]);
f();
f = (pfun)(p[1][1]);
f();
}
|
|