父类指针强转为子类指针的问题

https://bbs.csdn.net/topics/390719124

问题:
经常看到一个函数的参数包含一个父类指针 例如void fun(Base*msg) 然后函数体内把msg强转为 子类的指针:Child*pchildMsg =(Child*)msg  然后对pchildMsg一通操作包括成员函数和成员变量。
 问题是pchildMsg不是不能访问子类成员变量吗?
不能访问到pchildMsg的成员变量,是因为该成员变量没有被初始化,内存里面是垃圾数据,但是可以对其进行赋值操作。是不是这样?
class Base
{
public:
virtual void B_VF(){}
void D_f(){}
int m_i;
};
class Derive :public Base
{
public:
void B_VF(){}
int D_f(){
printf("Derive Derive and m_i = %d\n",m_i2);
return 0;
}
int m_i2;//m_i2放在string后面定义会如何?
std::string name;
};
int main()
{
Base*pB11 = new Base;
Derive *pd = (Derive*)pB11;//父类指针转成子类
printf("pd->m_i2=%d\n",pd->m_i2);//结果是乱码
pd->m_i2 = 100;
printf("pd->m_i2=%d\n",pd->m_i2);//结果是100

}
父类指针强转为子类指针后
原来总认为不能访问子类的成员变量,现在竟然可以赋值

 

回答1:
这种指针转换安全与否与继承无关
任意场合都可以强转, 代价是这样做结果不可预知

回答2:
这就是指针的优点与缺点.
指针的-->到成员,仅仅是对象基指针的偏移, 你完全可以把一个类强制转换成任意一个完全不相干的类, 你发现仍然能访问, 只是数据不确定,安全性不确定.

比如两个类:
class A
{
 public:
 int a; 
};
class B
{public:
 int b;
};

A  *pA = new A;
pA->a = 10;

B *pB = (B*)pA;
pB->b; //你会发现这里不但能访问, 还是正确的10.

回答3:
你经常看到的那个,和你这儿举的例子,应该是有本质区别。
尽管接口是父类指针,但是传参的时候传的子类指针。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值