wangb010103 2019-06-08 21:26 采纳率: 100%
浏览 342
已采纳

CDialogEx类的pointer this怎么可以调用CFrameWnd类的CreateView函数(但我的电脑里确实可以!!!)

当我查看原来写的MFC代码时,发现了一个不可思议的问题,代码如下

CMyView * CDialogViewDlg::openNewView(CMyDocument * newDoc)
{
    CCreateContext pContext;
    pContext.m_pCurrentDoc = newDoc;
    pContext.m_pNewViewClass = RUNTIME_CLASS(CMyView);
。。。
    CMyView * newView = (CMyView *)((CFrameWnd*)this)->CreateView(&pContext);
    ASSERT(newView);
。。。
    return newView;
}

注意代码里的(CFrameWnd*)this)->CreateView(&pContext);
我先把CDialogEx继承下来的对象指针this强制性转换成CFrameWnd*,再调用CFrameWnd类的CreateView创建View窗口,结果成功!!

我万万不解的是CDialogEx类从CWnd类继承而来,而CFrameWnd类也是从CWnd继承而来,表明CDialogEx和CFrameWnd的对象是“兄弟”关系,但怎么强制转换后就可以调用平辈的CreateView,而且还成功了?!求哪位大神帮我解释一下,谢谢!!

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-06-08 22:11
    关注

    强制转换就是这么夸张,只要内存对上了,就能蒙对。对不上,就出各种奇怪的错误,看下面的程序

    #include <iostream>
    using namespace std;
    class A
    {
    public:
        int x;
        void foo() { cout << "x=" << x << endl; }
    };
    class B
    {
    public:
        int y;
        void foo() { cout << "y=" << y << endl; }
    };
    int main()
    {
        A a;
        a.x = 10;
        B *b = (B *)&a;
        b->foo();
        return 0;
    }
    

    显然A B两个类无关,连兄弟都不算,但是就是蒙上了。

    C/C++语言这种夸张的事情很多,比如明明数组越界,还能访问。还可以通过内存访问私有变量

    #include <iostream>
    using namespace std;
    class A
    {
    public:
        int x;
    };
    class B
    {
    private:
        int x;
    public:
        B(int a) { x = a; }
    };
    int main()
    {
        B b(123);
        A *a = (A *)&b;
        cout << a->x;
        return 0;
    }
    

    甚至都不要类,直接用int *都行:

    #include <iostream>
    using namespace std;
    class B
    {
    private:
        int x;
    public:
        B(int a) { x = a; }
    };
    int main()
    {
        B b(123);
        cout << *((int *)&b) << endl;
        return 0;
    }
    

    如果你觉得这些不可接受,你就可以放弃这种粗暴而原始的语言了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型