一个名叫Style的单文档MFC程序。其中有框架类CMainFrame 和视类 CStyleView
孙鑫《VC++深入详解》354页倒数第五行说框架类是视类的父窗口,可是,这两者明明是平级的关系:前者派生于CFrameWnd 后者派生于CView,CFrameWnd和CView又都派生于CWnd。即视类和框架类无父子关系。我觉得孙鑫搞错了。但是接下来,却可以这样操作:void CStyleView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
CView::OnMouseMove(nFlags, point);
}
其中m_wndStatusBar是框架类的公有成员。让我不解的是,既然视类不是框架类的子类,为何可以在视类的成员函数OnMouseMove里调用GetParent()来访问框架类的成员。按着我的解释,此时GetParent()返回的应该是父类类型的指针,然后经过强制转换,将这个指针转制成了CMainFrame型的,然后用它来访问框架类的成员。——我的第一个问题是:以上所说,都对吗?不对,请指证探讨。
第二个问题:October 2001 MSDN里查得:GetParent()返回的是指向直接父类( the immediate parent)的指针,可是它的返回类型是CWnd,难道视类的直接父类不是CView吗?继承层次上,视类CStyleView明明就直接派生于CView。
第三个问题:我查阅一下GetParentOwner(),英文说它返回的是GetParentOwner returns a pointer to the most immediate parent or owner window ,请解释一下the most immediate parent
我又写了一个控制台程序来验证:#include<iostream>
using namespace std;
class CWnd
{
public:
void func(){cout<<"Cwnd"<<endl;}
};
class CView:public CWnd
{
public:
void func1(){cout<<"CView"<<endl;}
};
class CStyleView:public CView
{
public:
void func2(){cout<<"CStyleView"<<endl;}
};
class CFrameWnd:public CWnd
{
public:
void func3(){cout<<"CFrameWnd"<<endl;}
};
class CMainFrame:public CFrameWnd
{
public:
void func4(){cout<<"CManFrame"<<endl;}
};
int main()
{
CView* p;
((CFrameWnd*)p)->func3();
return 0;
}运行正确,跟我预想的一样。我的第四个问题:主函数中的p明明是一个未初始化的野指针,为何能用它来访问类成员呢?
 问题较长,麻烦高手了。

解决方案 »

  1.   

    你可能理解有问题:作为类, CStyleView 肯定派生于CView。但是从窗口来说,
    CStyleView窗口作为CMainFrame的子窗口声明的。 GetParent()是返回父窗口,不是返回父类。the most immediate parent就是爸爸,而不是爷爷以上。
      

  2.   

    这两者明明是平级的关系:前者派生于CFrameWnd 后者派生于CView,CFrameWnd和CView又都派生于CWnd。即视类和框架类无父子关系。
    =====================================
    这个想法本身就不对,这两个类都派生于CWnd类与它们有无父子关系没有关系。
    窗口之间的父子关系与类继承并没有什么联系。
      

  3.   

    父与子的关系,是在你创建窗口的时候传进去的,或SetParent进去。是对象(窗口)层次上的,不是类层次上的。你把这都搞混淆了。建议你还是不要先看视频了,先看看c++基础教程吧。
      

  4.   

    C++基础教程?你告诉哪个C++基础教程讲解了子窗口与父窗口?C++基础里,讲得是类,根本不谈界面编程的事。
      

  5.   

    他说的是框架窗口是视图窗口的父窗口,窗口的父子关系在调用Create的时候指定,比如CWnd::Create参数5就是要求你指定的父窗口指针,或者像前面说的用SetParent指定父窗口
      

  6.   

    两个类都派生于CWnd类,没什么平等级别不平等的
      

  7.   

    这里的GetParent,应当理解为GetOwer,是MainFrame拥有view。