在MFC中 将父类指针赋予子类指针,子类指针调用子类成员,为什么不会报错

奋进的小鸟 2015-07-31 04:19:22
在MFC中 将父类指针赋予子类指针,子类指针调用子类公有成员,为什么不会报错
例如CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd;
pMain->m_nCount = 3;
m_pMainWnd是CWnd类型的指针,CMainFrame 是 CWnd 的子类,m_nCount是CMainFrame的公有成员。
...全文
185 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
二班的码农 2015-08-03
  • 打赏
  • 举报
回复
这不光是mfc中的问题,这是C++标准中类继承和强制转换的问题 如果楼主能明白指针实现机制就不难理解上面的问题了
奋进的小鸟 2015-08-03
  • 打赏
  • 举报
回复
[quote=引用 8 楼 mayudong1 的回复:] #include <stdlib.h> class CPerson { }; class CFarmer : public CPerson { public: int m_iAge; }; int main() { CFarmer person; CPerson *pPerson = (CPerson*)&person; CParmer* pFarmer = (CFarmer*)pPserson; pFarmer->m_iAge = 3; system("pause"); return 0; } 因为mfc中的操作实际上是类似这样的 我也猜到应该是这样,请问有人可以再详细地解释一下吗?或者粘贴源码?
shenyi0106 2015-08-03
  • 打赏
  • 举报
回复
引用 5 楼 u010463663 的回复:
大家回答的好像不是我想要的。。。但还是谢谢大家都回答 #include <stdlib.h> class CPerson { }; class CFarmer : public CPerson { public: int m_iAge; }; int main() { CPerson person; CFarmer *pFarmer = (CFarmer*)&person; pFarmer->m_iAge = 3; system("pause"); return 0; } 将父类指针赋予子类指针,子类指针调用子类公有成员,编译通过,但运行结束后弹出错误: Stack around the variable 'person' was corrupted 中文翻译就是“在变量“person”周围的堆栈已损坏” 这个例子跟我最开始的例子有什么区别吗? 可以帮忙详解一下MFC中的动态类创建机制吗?
有孩子,必定有老子;但是有老子,却未必有孩子! 你要能理解这句话,就OK了。要理解不了,估计在怎么解释也是无用的。
mayudong1 2015-08-03
  • 打赏
  • 举报
回复
#include <stdlib.h> class CPerson { }; class CFarmer : public CPerson { public: int m_iAge; }; int main() { CFarmer person; CPerson *pPerson = (CPerson*)&person; CParmer* pFarmer = (CFarmer*)pPserson; pFarmer->m_iAge = 3; system("pause"); return 0; } 因为mfc中的操作实际上是类似这样的
二班的码农 2015-08-03
  • 打赏
  • 举报
回复
由于指针类型是CFarmer,调用pFarmer->m_iAge,编译器不会报错,编译器只能进行静态检测 由于CFarmer实际的内存空间是基类,并不m_iAge成员变量,当调用pFarmer->m_iAge时,程序通过成员变量在类中的偏移量查找成员变量内存地址,结果查找的内存地址超出了程序内存空间范围,在对内存数据进行更改时,报错 如果只是读数据,一般不报错
二班的码农 2015-08-03
  • 打赏
  • 举报
回复
1. 如果m_pMainWnd指向的是子类空间,当然不会报错 2. 即使m_pMainWnd指向的是基类空间,虽然 pMain->m_nCount非法, 但如果其未超出程序进程的内存空间,就不会报错 楼主在进行下行转换时,即由基类指针转换成子类指针,最好用dynamic_case来动态检测转换的安全性
奋进的小鸟 2015-08-03
  • 打赏
  • 举报
回复
大家回答的好像不是我想要的。。。但还是谢谢大家都回答 #include <stdlib.h> class CPerson { }; class CFarmer : public CPerson { public: int m_iAge; }; int main() { CPerson person; CFarmer *pFarmer = (CFarmer*)&person; pFarmer->m_iAge = 3; system("pause"); return 0; } 将父类指针赋予子类指针,子类指针调用子类公有成员,编译通过,但运行结束后弹出错误: Stack around the variable 'person' was corrupted 中文翻译就是“在变量“person”周围的堆栈已损坏” 这个例子跟我最开始的例子有什么区别吗? 可以帮忙详解一下MFC中的动态类创建机制吗?
阿源是少年 2015-08-03
  • 打赏
  • 举报
回复
虽然声明为CWnd*,但是实际工程中OnInitInstance()里面赋给m_pMainWnd却是CMainFrame*,所以m_pMainWnd的实际类型是CMainFrame,所以你调用CMainFrame的成员是完全没问题的,如果m_pMainWnd的实际类型不是CMainFrame*,就会出问题
小茸 2015-08-02
  • 打赏
  • 举报
回复
m_pMainWnd 指向的是CMainFrame类型的指针。 即使它声明为CWnd
shenyi0106 2015-07-31
  • 打赏
  • 举报
回复
没看懂,你这整篇就一个指针,指向主窗口的指针,哪来的父类和子类? m_nCount 是你CMainFrame这个对象的成员,你访问它当然没错。要真出错了,那也不是你的错,是微软的错
worldy 2015-07-31
  • 打赏
  • 举报
回复
CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd; pMain->m_nCount = 3; pMain是一个CMainFrame 的对象 m_nCount是CMainFrame 的成员 pMain->m_nCount[/color] = 3;当然不会错!
schlafenhamster 2015-07-31
  • 打赏
  • 举报
回复
(CMainFrame*) 已经转成 子窗口 CMainFrame

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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