#include <cstdio>
class A{
public:
A(){
a = 0;
}
int a;
};
class B:public A{
public:
B(){
a = 1;
}
int a;
};
int main(){
B* pb = new B();
A* pa = pb;
printf("a in B is: %d\n", pb->a);
printf("a in A is: %d\n", pa->a);
printf("value of pb is: %p\n", pb);
printf("value of pa is: %p\n", pa);
printf("address of pb->a is: %p\n", &(pb->a));
printf("address of pa->a is: %p\n", &(pa->a));
return 0;
}
a in B is: 1
a in A is: 0
value of pb is: 0x7fa97ac04b20
value of pa is: 0x7fa97ac04b20
address of pb->a is: 0x7fa97ac04b24
address of pa->a is: 0x7fa97ac04b20
以下现象:
1. 输出中的第1行和第2行。
pb->a是1,pa->a是0。这应该没有任何疑问。
2. 输出中的第3行和第4行。
可以看出来,pb和pa的值完全一样(指向同一个地址)。
3. 输出中的第5行和第6行。
pb->a和pa->a的地址不一样。
以下解释:
1. 父类中的a和子类中的a是两个不同的变量。
2. p->a的地址是p的值加上a的偏移量。
3. 父类的属性一般比较靠前,父类中的a的偏移量为0,子类中的a的偏移量为4。
4. 如果p是父类的指针,p->a的地址等于p的值加上0。如果p是子类的指针,p->a的地址等于p的值加上4。