您的位置:首页 > 理论基础 > 计算机网络

c++父类指针指向子类的具体原理? http://www.zhihu.com/question/31345300

2015-12-12 20:58 591 查看


c++父类指针指向子类的具体原理?

比如我有两个类,父类A,子类是B,其中父类A有一个属性a,比如我默认构造函数设置这个a的值为0,子类B也有一个属性a,我设置这个值为1,现在我父类A的指针temp1指向子类B 的一个对象temp2,输出temp1->a值是0,但是为啥不是1呢

诶,刚学这个并不是很懂

1
条评论

分享

按投票排序按时间排序


3 个回答

2赞同
反对,不会显示你的姓名



刘项http://github.com/lexdene

cnfan专业挖坑埋自己 赞同

为了方便我解释,我把题主说的事情写成了代码:

#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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: