编程参考 - C++里的类指针不要乱传

今天遇到一个问题,代码执行时程序卡死,原因莫名其妙。

只是使用了一个指针进行传递,将子类指针赋值给基类指针,然后又将这个基类指针转成另一个子类指针,就挂了。

log打印了一下,发现了问题,原来指针值发生了变化。

那么问题来了,类指针的传递,一直是不变的值么?

下面我们分情况讨论一下。

第一种情况,上代码:

#include <stdio.h>

class A{

public:

   int a[123];

};

class B: public A{

public:

    int b[120];

};

class C : public B{

public:

    int c[120];

};

int main()

{

  A* pa;

  B* pb;

  C* pc;

  C c;

  pa = &c;

  pb = &c;

  pc = &c;

  printf("A pointer: %X, B pointer: %X, C pointer: %X\n", (unsigned  int)pa, (unsigned  int)pb, (unsigned int)pc);

  return 0;

}

$ g++ -o test test.cpp -fpermissive

$ ./test

A pointer: 27312250, B pointer: 27312250, C pointer: 27312250

我们看到将一个子类指针传给父类,指针值没变都是一样的。

第二种情况,再看下面例子:

#include <stdio.h>

class A{

public:

   int a[123];

};

class B{

public:

    int b[120];

};

class C : public A, public B{

public:

    int c[120];

};

int main()

{

  A* pa;

  B* pb;

  C* pc;

  

  C c;

  pa = &c;

  pb = &c;

  pc = &c;

  printf("A pointer: %X, B pointer: %X, C pointer: %X\n", (unsigned  int)pa, (unsigned  int)pb, (unsigned int)pc);

  return 0;

}

$ g++ -o test test.cpp -fpermissive

$ ./test

A pointer: 4E887DE0, B pointer: 4E887FCC, C pointer: 4E887DE0

因为这里使用了多重继承,所以,子类的指针和父类的指针就会有不同的情况。

这时在使用中,就要注意了。

而这个指针不同的原因,这里就不研究了,这个和类在内存中的组织结构有关。

那么我遇到的问题的原因,就是指针发生变化后,还以不同类型的方式去调用,结果就出错了,程序跑飞了。

以上面代码为例,我的使用方式就类似于:

C c;

pb = &c;

pc = pb;

pc->func();

pb的指针值是不同的,然后又将其赋值给pc,类型就不匹配,调用就会出错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值