MyDialog(CWnd* pParent = NULL);   //(1)
MyDialog(CView* pView); //(2) CChildView::CChildView()
{
pDlg = new MyDialog(this);
}实在想不通,编译器居然调用第一个构造函数
后来强行指定类型才调用(2)构造函数pDlg = new MyDialog((CView*) this);
我知道CView是派生于CWnd,但是this指针明明就是CView类型啊.
难道编译器更喜欢参数缺省吗?

解决方案 »

  1.   

    pDlg = new MyDialog(this); 
    相当于
    pDlg = new MyDialog(); this指针可以不用写 this 指向的是当前对象本身。也就是CChildView的构造的对象
    所以调用MyDialog(CWnd* pParent = NULL);  //(1) 
    上边的构造函数有默认值.pDlg = new MyDialog((CView*) this); 
    你相当于把this所指定的对象转换成了cview了。所以掉用MyDialog(CView* pView); 
      

  2.   

    MyDialog(CWnd* pParent = NULL);  //(1) 
    这个东东是MFC 自已生成的啊. 我有什么办法....MyDialog(CView* pView); //(2) 这个才是我想的
    我要通过构造函数将view针指传给Dialog这样一来.非模态对话框才能给Dialog发消息
    UpdateDate()
    pView->SendMessage(WM_ENDDIALOG);
    DestroyWindow( );
      

  3.   

    CWnd是CView的基类,用基类指针CWnd*类型来传递CView*不正好实现多态吗,lz觉得有什么问题?
      

  4.   

    //我做了一个实验. class CWnd
    {
    public:
    void printCWnd() { cout << "This is CWnd" << endl;}
    };class CView : public CWnd 
    {
    public:
    void printCView() {cout << "This is CView" << endl; }
    };class Dialog: public CWnd //Dialog重载两个构造函数
    {
    public:
    Dialog(CWnd* pCWnd) { pCWnd->printCWnd(); } //构(1)
    Dialog(CView* pCView) { pCView->printCView(); } //构(2)
    };class ChildView:public CView
    {
    public:
    ChildView() { Dialog* pMyDlg = new Dialog(this); }
    };void main()
    {
    ChildView test;
    system("PAUSE");
    }/*
    运行结果:
    This is CView
    请按任意键继续. . .
    说明程序还是调用了2号构造函数
    可是在MFC里面为什么却不一样呢????