父类指针强转为子类指针

tian8421 2014-02-27 10:27:23
经常看到一个函数的参数包含一个父类指针 例如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

}
父类指针强转为子类指针后
原来总认为不能访问子类的成员变量,现在竟然可以赋值
...全文
889 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Johnblx 2014-02-28
  • 打赏
  • 举报
回复
那是因为传参的时候就传的子类指针
引用 楼主 tian8421 的回复:
经常看到一个函数的参数包含一个父类指针 例如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 } 父类指针强转为子类指针后 原来总认为不能访问子类的成员变量,现在竟然可以赋值
xiaohuh421 2014-02-28
  • 打赏
  • 举报
回复
这就是指针的优点与缺点. 指针的-->到成员,仅仅是对象基指针的偏移, 你完全可以把一个类强制转换成任意一个完全不相干的类, 你发现仍然能访问, 只是数据不确定,安全性不确定. 比如两个类: class A { public: int a; }; class B {public: int b; }; A *pA = new A; pA->a = 10; B *pB = (B*)pA; pB->b; //你会发现这里不但能访问, 还是正确的10.
mujiok2003 2014-02-27
  • 打赏
  • 举报
回复
看看这个, 其中讲到了具体C++标准
tian8421 2014-02-27
  • 打赏
  • 举报
回复
引用 2 楼 ma100 的回复:
这种指针转换安全与否与继承无关 任意场合都可以强转, 代价是这样做结果不可预知
你说的是不是这种情况: int* i = new int; ((Derive*)i)->m_i2 = 100; printf("%d",((Derive*)i)->m_i2); 其实不是继承的问题?
tian8421 2014-02-27
  • 打赏
  • 举报
回复
引用 3 楼 dbzhang800 的回复:
你经常看到的那个,和你这儿举的例子,应该是有本质区别。
引用
经常看到一个函数的参数包含一个父类指针 例如void fun(Base*msg) 然后函数体内把msg强转为 子类的指针:Child*pchildMsg =(Child*)msg 然后对pchildMsg一通操作包括成员函数和成员变量。
这个,尽管接口是Base *mag的指针,但是传递的参数应该是 new Child 这样的吧?

Base*pB11 = new Derive;
Derive *pd = (Derive*)pB11;//父类指针转成子类
是的 我也觉得是这样:接口是Base *mag的指针,但是传递的参数应该是 new Child
dbzhang800 2014-02-27
  • 打赏
  • 举报
回复
你经常看到的那个,和你这儿举的例子,应该是有本质区别。
引用
经常看到一个函数的参数包含一个父类指针 例如void fun(Base*msg) 然后函数体内把msg强转为 子类的指针:Child*pchildMsg =(Child*)msg 然后对pchildMsg一通操作包括成员函数和成员变量。
这个,尽管接口是Base *mag的指针,但是传递的参数应该是 new Child 这样的吧?

Base*pB11 = new Derive;
Derive *pd = (Derive*)pB11;//父类指针转成子类
ma100 2014-02-27
  • 打赏
  • 举报
回复
这种指针转换安全与否与继承无关 任意场合都可以强转, 代价是这样做结果不可预知
漫步者、 2014-02-27
  • 打赏
  • 举报
回复
int m_i; 将它设置为private,看你的结论是否正确

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧