class A
{
public:int i;
public:A(/* args */):i(3){};voidf(){};};
class B: public A
{
private:int j;
public:B():j(30){};voidf(){cout<<"B::f() j="<<j<<endl;};};intmain(){
A a;
B b;int*p=(int*)&b;
cout<<p<<" "<<*p <<endl;
p++;//让p指向j 因为增加的部分都在后面,//所以对于父类的偏移都是正确的,因此可以让父类的指针指向子类*p=100;
b.f();//B::f()=100 说明通过指针p 可以修改B的私有成员变量return0;}
class A{
public:A():i(10){};
virtual voidf(){cout<<"A::f() "<<i<<endl;}int i;};intmain(){
A a;
a.f();
cout<<sizeof(a)<<endl;//16int*p=(int*)&a;//将类A的地址取出来,转为int型指针
cout<<*p<<endl;//4211952 }
同一类的vtable 都指向同一块内存区域,子类与父类的vtable的结构一样,但值不一样
intmain(){
A a;
A b;int* p=(int*)&a;int*q=(int*)&b;
cout<<*p<<" "<<*q<<endl;//4211952 4211952 //说明同一类的vtable都指向同一块内存区域int*x=(int*)*p;
cout<<*x<<endl;return0;}
**.**不会动态绑定,指针或引用才会动态绑定
class A
{
public:A():i(10){};
virtual voidf(){ cout <<"A::f() "<< i << endl;}int i;};
class B: public A
{
public:B(/* args */):j(1){};
virtual voidf(){ cout <<"B::f() "<< j << endl;}int j;};intmain(){
A a;
B b;
A *p=&b;//动态绑定 当调用虚函数时,实际上是通过对象的虚函数表找到对应的函数地址进行调用
p->f();//B:f() 1return0;}