C++父类指针指向子类原理

该代码示例展示了C++中继承的概念,以及如何通过指针访问类的成员变量。子类B继承自类A,两者都有成员变量a。一个B类的对象通过B*指针pb创建,然后用A*指针pa引用同一内存空间。尽管pb->a和pa->a的值不同,但它们指向的内存地址显示了父类和子类在内存中的布局差异,子类的a成员在父类a之后,具有不同的偏移量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值