免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4720 | 回复: 2
打印 上一主题 下一主题

[函数] 请问下边段代码,为什么都会调用CDocument::Serialize()函数,谢谢! [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-03 23:39 |只看该作者 |倒序浏览
我在学习深入浅出MFC的时候,树上说,把virtual去掉,则程序只会调用CDocument::Serialize()函数,我不明白为什么?

请大家帮助一下,谢谢!



#include <iostream>
#include <string>
using namespace std;
#include "test\test.h"

class CObject
{
public:
       
               //virtual
        void Serialize(){cout << "CObject::Serialize() \n\n"; }


};



class CDocument : public CObject
{
public:
        int m_data1;
        //virtual
    void Serialize(){cout << "CDocument::Serialize() \n\n"; }

    void func()
        {
            cout << "CDocument::func()" << endl;
        Serialize();
        }
};


class CMyDoc : public CDocument
{
public:
        int m_data2;
        //virtual
        void Serialize(){cout << "CMyDoc::Serialize() \n\n"; }
};



int main(int argc, char* argv[])
{


        CMyDoc mydoc;
    CMyDoc* pmydoc = new CMyDoc;

        cout  << " #1 testing" << endl;
        mydoc.func();

        cout  << " #2 testing" << endl;
        ((CDocument*)(&mydoc))->func();

        cout  << " #3 testing" << endl;       
    pmydoc->func();
       
        cout  << " #4 testing" << endl;       
    ((CDocument)mydoc).func();

        return 0;
}




程序执行结果如下:
#1 testing
CDocument::func()
CDocument::Serialize()

#2 testing
CDocument::func()
CDocument::Serialize()

#3 testing
CDocument::func()
CDocument::Serialize()

#4 testing
CDocument::func()
CDocument::Serialize()

Press any key to continue

论坛徽章:
0
2 [报告]
发表于 2007-05-04 07:48 |只看该作者
首先要知道虚函数在运行时才绑定具体的函数,而非虚函数则是在编译阶段就确定了具体调用哪个函数,前者叫晚绑定,后者叫早绑定
其次要理解继承-子类继承父类的所有特性
#1 testing
CDocument::func()
CDocument::Serialize()
mydoc.fun()->CDocument::func()->CDocument::Serialize()
注意编译时mydoc.fun()已经放的是CDocument::func()的逻辑地址,而CDocument::func()内部对Serialize()只会在继承层次中向上找,因为他自己实现了Serialize(),所以编译的时候确定的是CDocument::Serialize(),为什么不插入子类的CMyDoc::Serialize(),因为父类无法感知子类的存在-编译父类的时候子类可能还不存在,呵呵
#2 testing
CDocument::func()
CDocument::Serialize()
正是所谓的向上类型转换,不会出现问题,现在mydoc已经指向CMyDoc mydoc这个大对象中的CDocument
小对象,这里可以参考有些书上介绍的对象布局的部分,另外这里虽然用指针,但不会出现动态绑定的情况,因为serialize不是virtual的
#3 testing
CDocument::func()
CDocument::Serialize()
同test 1的解释,只不过把原来的对象改成了该类型对象的指针而已,注意指针的类型依然是CMyDoc
#4 testing
CDocument::func()
CDocument::Serialize()
同test 2

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-05-04 11:40 |只看该作者
原帖由 apollolegend 于 2007-5-4 07:48 发表
首先要知道虚函数在运行时才绑定具体的函数,而非虚函数则是在编译阶段就确定了具体调用哪个函数,前者叫晚绑定,后者叫早绑定
其次要理解继承-子类继承父类的所有特性
#1 testing
CDocument::func()
CDocume ...



大侠说得很对,昨晚我从C++ Primer一书中,得到如下解释:
为了用“已被派生类重用的名字”来访问基类的成员,必须用类域操作符限定修饰基类成员。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP