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

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:
你经常看到的那个,和你这儿举的例子,应该是有本质区别。
尽管接口是父类指针,但是传参的时候传的子类指针。

 

上一篇:在网页上画一个矩形(HTML5 Canvas作图)


下一篇:leetcode-123-买卖股票的最佳时机③