派生的关系
CWnd
|--CFrameWnd
|---CMainFrame
===========================
问题
指向CMainFrame的this指针,却用在了一处需要CWnd*参数类型的地方。(这是一个教程例子中出现的)
我不明白指向派生类的指针放在了指向基类指针参数类型的地方?Why?备注:CButton::Create
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );中第四个参数出用的指向CMainFrame的this指针。希望大家帮我分析下,谢谢!
CWnd
|--CFrameWnd
|---CMainFrame
===========================
问题
指向CMainFrame的this指针,却用在了一处需要CWnd*参数类型的地方。(这是一个教程例子中出现的)
我不明白指向派生类的指针放在了指向基类指针参数类型的地方?Why?备注:CButton::Create
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );中第四个参数出用的指向CMainFrame的this指针。希望大家帮我分析下,谢谢!
举个例子吧
class Person
{
...
};
class Student:public Person
{
...
};
void Dance(Person& p); //人会跳舞,这个就相当于Create,用基类的指针(或引用),Create在CWnd中也有定义,这样就可以保证CButton CFrameWnd都可以用
void Study(Student& S); //学生会学习...
Person p;
Student S;Dance(p); //肯定正确
Dance(s); //也正确,学生也是人,也可以跳舞,相当于CMainFrame里面调用Study(p); //错误,人不都是学生
我的疑问是:此例把指向派生类对象的this指针强制类型转换成了指向基类类型的指针,那么编译器限制指向派生类对象的指针去直接指向基类对象,只是为了提醒程序员犯(非本意的)低级错误?只要有把握就可以强类型转换?
对于你的疑问的例子是:比如一个函数需要CFrameWnd*指针,用CWnd*类型的指针去调用,就可能是错误的,编译器会警告,除非确定这个指针指向的就是CFrameWnd类型的对象才可以强制类型转换。
我的意思是,书上说指向派生类对象的指针不能直接指向基类对象,
但是我在例子中看到:指向CMainFrame的this指针,却用在了一处需要 CWnd* 参数类型的地方。运行也通过了。大家没有什么疑问吗?
希望大家帮我分析下是怎么通过的,或者我应该用什么样的方法可以自己分析?谢谢!
但是我在例子中看到:指向CMainFrame的this指针,却用在了一处需要 CWnd* 参数类型的地方。运行也通过了。
-------------------------
书上的意思和你看到的例子是正好相反的。
书上是说:建立一个基类对象,你不能拿派生类对象的指针来指向他,把这个基类对象当成派生类对象来用。
你看到的例子是:建立了一个派生类对象,用基类对象的指针来指向他,把这个派生类对象当基类对象来用,这是C++的多态,是完全合法而且是安全的。
this是指向派生类对象(CMainFrame)的指针,但是却用在了需要 CWnd* 参数类型的地方(CWnd是CMainFrame的间接基类)。Why?
如果不是编译器帮助进行了常量地址的强制类型转换,那会是什么操作呢?