goback
月期刊咨询网
当前位置:首页>>软件开发论文>>正文

软件开发论文继承情况下直接调用类成员函数地址


所属栏目:软件开发论文
发布时间:2013-10-23 13:14:55  更新时间:2013-10-23 13:49:53

已签订领域:化学工程/制药,医学题目:**作为抗癌剂***催化剂**取代苯丙***SCI四区 直击了解更多选题

已签订领域:环境科学-公共卫生题目:用**电***生物传感器**癌症**SCI二区 直击了解更多选题

已签订领域:环境科学-公共卫生题目:**氧化石墨烯纳米***材料的生物传感器***结肠癌生物**癌胚****SCI二区 直击了解更多选题

已签订领域:环境科学-公共卫生题目:聚合物纳米***a-硫辛酸***在神经炎症***应用***临床分析SCI二区 直击了解更多选题

已签订领域:计算机视觉/遥感/智能驾驶/汽车题目:**深度学习***高分辨率遥感***车辆检***SCI三区 直击了解更多选题

已签订领域:企业管理题目:社会交流***领导***倾向***方向SSCI,SCI三区,二区 直击了解更多选题

已签订领域:企业管理题目:**中小企业社交媒体****可持续绩效***因素探析SSCI,SCI三区,二区 直击了解更多选题

已签订领域:环境科学,公共卫生题目:利用硫氨酸***石墨烯纳米***电化学***传感器实现癌胚抗原***SCI二区 直击了解更多选题

已签订领域:环境科学,公共卫生题目:基于抗***纳米复合***高性能***早起癌症诊断***SCI二区 直击了解更多选题

已签订领域:经济,能源题目:***政治冲突****绿色金融、金融**、气***化***SCI四区 直击了解更多选题

已签订领域:经济,能源题目:冲***中能源不安全对***和环境***SCI四区 直击了解更多选题

已签订领域:教育题目:大学生***社交媒体***成绩影响***SSCI三区 直击了解更多选题

已签订领域:教育题目:巴基斯坦***学习实施的***的**SSCI二区 直击了解更多选题

已签订领域:教育题目:大学生对****下网络教学**思***SSCI二区 直击了解更多选题

已签订领域:教育题目:**教师和学生对影响***医疗**效果的****看法SSCI三区 直击了解更多选题

已签订领域:计量经济学题目:**货币、黄金、**和美国***的波动***相互依赖性:**数据的分析SSCI一区 直击了解更多选题

已签订领域:计量经济学题目:东南亚***内**趋同***中等收入**:新**的***SSCI二区 直击了解更多选题

已签订领域:建筑,历史题目:历史景点在***旅游发***中的***影响**(**研究:**历史***)SSCI,SCI一区 直击了解更多选题

已签订领域:领导力,管理题目:量化**领导对角色绩效***响:**冲突与工作自主性***作用SCI二区 直击了解更多选题

已签订领域:信息技术,教育题目:数字***环境对学生学习成绩***:游戏**和***现实在教育***作用SSCI四区 直击了解更多选题

已签订领域:信息技术,教育题目:信息技术***续决策之间的***:创新***识的**作用SSCI二区 直击了解更多选题

已签订领域:信息技术,教育题目:课程**对大学生***发展的影响:学习习惯和***的***作用SSCI一区 直击了解更多选题

已签订领域:信息技术,教育题目:信息技术***与可持续决策**:高等***学生认知***作用SSCI二区 直击了解更多选题

已签订领域:计算机,英语教学题目:英语****学**与人工智能****学习SCI三区 直击了解更多选题

已签订领域:计算机,音乐题目:评价**和音乐**对学生成绩***的影响SCI三区 直击了解更多选题

已签订领域:人体工程,心理学题目:基于预先处理模型***模式人体工程学***女生肌肉骨骼***预防行为*** 直击了解更多选题

已签订领域:人体工程,心理学题目:制定一个***人体工程学**,以识别、优先考虑***职业压力源的*** 直击了解更多选题

已签订领域:人体工程,心理学题目:多重工作**压力和工作***:***工效学方法的混合方法*** 直击了解更多选题

已签订领域:数学,经济题目:数学模型***结构调整和经济转型****研究 直击了解更多选题

已签订领域:数学,经济题目:***时间**数学模型在***媒体营销**中的应用*** 直击了解更多选题

已签订领域:数学,经济题目:***时间**模型在***物流运**能力***研究 直击了解更多选题

已签订领域:数学,经济题目:碳****经济的数学模型****研究 直击了解更多选题

已签订领域:农村经济题目:农****社区**发展***分**SCI四区 直击了解更多选题

已签订领域:农村经济题目:创业***对乡村****发展的****SCI四区 直击了解更多选题

已签订领域:农村经济题目:农村创业****的空间*****究SCI四区 直击了解更多选题

已签订领域:医学,电化学题目:纳米颗粒*****及其在癌症****和重金属*****检测中的应用SCI三区 直击了解更多选题

已签订领域:医学,电化学题目:基于*****前列腺癌药物氟****检测方法的*****腺癌治疗SCI二区 直击了解更多选题

已签订领域:医学,电化学题目:气海***********金纳米颗粒的新型****************粘土及其对胃癌********************抗癌SCI二区 直击了解更多选题

已签订领域:医学,电化学题目:基于抗***********GCE纳米***********材料的高性能*******************早期癌症SCI二区 直击了解更多选题

已签订领域:医学,电化学题目:用******电化学生物传感器*****癌症***************SCI二区 直击了解更多选题

已签订领域:医学,电化学题目:基于*****石墨烯纳米****材料的生物传感******用于测定结肠*****生物*****SCI二区 直击了解更多选题

已签订领域:医学,电化学题目:聚合***纳米复合电极*****疏辛酸电化学检测*********SCI二区 直击了解更多选题

已签订领域:医学,电化学题目:利用****酸/**糖**石墨烯纳米复合修饰的电化学*****SCI二区 直击了解更多选题

已签订领域:环境能源,绿色投资题目:环境能源、绿色投资、城市化和环境类方向SCI三区 直击了解更多选题

已签订领域:计算机,英语教学题目:英语教学**人工智能***习SCI 直击了解更多选题

已签订领域:计算机,音乐题目:评价**和音乐形式*学生***影响SCI三区 直击了解更多选题

已签订领域:经济,绿色投资题目:***能源效率***化之间的***SCI三区 直击了解更多选题

已签订领域:经济政策题目:***阐明**印度经济***的关系SCI三区 直击了解更多选题

已签订领域:经济,金融题目:***国家的能源***重***SCI 直击了解更多选题

已签订领域:经济,金融投资题目:***融新之间***直接投资***SCI三区 直击了解更多选题

已签订领域:经济,数学,统计学,管理学题目:非***想重限制下***袭评价***SSCI四区 直击了解更多选题

已签订领域:经济,数字,管理学题目:基干***生产系统***SSCI四区 直击了解更多选题

已签订领域:农业,土壤科学题目:不同***有机覆盖***养分循环SSCI 直击了解更多选题

已签订领域:电力与能源系统,管理题目:pv***氢定价的***随***型稀SSCI,SCI二区 直击了解更多选题

已签订领域:建筑规划,计算机题目:使用***因子分析法***可持续***SCI三区 直击了解更多选题

已签订领域:工程技术,纺织工程,材料科学题目:甘***淀粉酶的提取***退浆中的应用SCI四区 直击了解更多选题

已签订领域:渔业,鱼类生理学题目:饲料***镉毒性的交互***生长***病理学***SCI二区 直击了解更多选题

已签订领域:渔业,鱼类生理学题目:****鱼水源***起的生******SCI三区 直击了解更多选题

已签订领域:金融,环境经济题目:*****预算在能效、绿色***的作用SCI 直击了解更多选题

已签订领域:应用数学/计算物理题目:***非线性库***自相位调制***SCI三区 直击了解更多选题

已签订领域:计算机,医学检测题目:***COVID-19***力***算法***决策SCI三区 直击了解更多选题

已签订领域:计算机,物联网,智慧城市题目:基于***物联网****算法SCI三区 直击了解更多选题

  [摘要]分析在继承情况下如何取类的成员函数的地址以及调用该地址。

  [关键词]C++成员函数,this指针

  根据类成员函数的种类不同,在继承下如何取成员函数的地址以及调用该地址的情况也是有所区别的。另外还要注意的是多继承下情况又是如何。类的成员函数和标准的C函数不同,类的成员函数有一个隐藏的指针参数this,它指向一个类的实例。在VC++中,this一般通过ECX寄存器来传递,而普通的成员函数的参数被直接压在堆栈中。this作为参数和其他普通的参数有着本质的不同,即使一个成员函数被一个普通函数的调用,在标准C++中这个成员函数和其他的普通函数的情况不相同,因为没有thiscall这样的关键字来保证它像普通参数一样正常的调用。为此,我分别就以下三种情况作了深入的分析。

  一、最简单的单继承,非虚拟函数的情况

  classA{

  public:

  intAf(){return1;}

  };

  classB:publicA

  {

  public:

  intBf(){return2;}

  };

  假如我们建立了B类的一个成员函数指针。在这个例子中,Af和Bf都是B的成员函数,所以我们的成员函数指针可以指向Af或者Bf。但是Af需要一个this指针指向B::A(后面我叫它Athis),而Bf需要一个this指针指向B(后面我叫它Bthis)。编译器保证了A类在物理上保存在B类的头部(即B类的起始地址也就是一个A类的一个实例的起始地址),这意味着Athis==Bthis。

  二、继承情况下的虚拟函数

  classA{

  Public:

  virtualintfv(){return11;

  }

  };classB:publicA{

  Public:

  virtualintfv(){return22;}

  };

  现在A和B都定义了虚函数fv,按C++语法,如果通过指针调用fv,应该发生多态行为。利用下面的代码:

  DWORDA_fv,B_fv;

  GetMemberFuncAddr_VC6(A_fv,&A::fv);

  GetMemberFuncAddr_VC6(B_fv,&B::fv);

  Ax;By;

  CallMemberFunc(0,A_fv,&x,0);//A::fv

  CallMemberFunc(0,B_fv,&x,0);//B::fv

  CallMemberFunc(0,A_fv,&y,0);//A::fv

  CallMemberFunc(0,B_fv,&y,0);//B::fv

  输出如下:

  11

  11

  22

  22

  请注意第二行输出,B_fv取的是&B::fv,但由于传递的this指针产生是&x,所以实际上调用了A::fv。同样,第三行输出,取的是基类的函数地址,但由于实际对象是派生类,最后调用了派生类的函数。这说明取得的成员函数地址在虚拟函数的情况下仍然保持了正确的行为。源代码:GetMemberFuncAddr_VC6(B_fv,&B::fv);产生的汇编代码如下:pushofset@ILT+90(`vcall')(0040105f)。

  原来取B::fv地址的时候,并不是真的就将B::fv的地址传给了函数,而是传了一个vcall函数的地址。顾名思义,vcall当然是虚拟调用的意思。我们找到地址0040105f,@ILT+90(??_9@$BA@AE):0040105Fjmp`vcall'(00401380)。该地址只是ILT的一个项,直接跳转到真正的vcall函数(00401380)。找到00401380,就可以看到vcall的代码'vcall':

  00401380moveax,dwordptr[ecx];//将this指针视为dword类型,并将指向的内容(对象的首个//dword)放入eax.

  00401382jmpdwordptr[eax];//跳转到eax所指向的地址。

  代码执行的时候,ecx就是this指针,具体说就是上面对象x或y的地址。而eax就是对象x或y的第一个dword的值。对于有虚拟函数的类对象,其对象的首地址处总是一个指针,该指针指向一个虚函数的地址表。上面的对象由于只有一个虚函数,所以虚函数表也只有一项。因此,直接跳转到eax指向的地址就好。如果有多个虚函数,则eax还要加上一个偏移量,以定位到不同的虚函数。比如,如果有两个虚函数,则会有两个vcall代码,分别对应不同的虚函数,编译器根据取的是哪个虚函数的地址,则相应的用对应的vcall地址代替。

  三、多继承情况

  很明显,现在情况要复杂得多。首先,指定成员函数的时候可能会碰到冲突。其次,给定this指针的时候需要经过调整。

  classA{public:

  intAf(){return1;};};

  classB{public:

  intBf(){return2;};};

  classD:publicA,publicB{public:

  intDf(){return4;};};

  现在我们建立一个D类的成员函数指针。在这种情况下,我们的成员函数指针可以指向Af、Bf或Df。但是Af需要一个this指针指向D::A,而Bf需要一个this指针指向D::B。这时编译器不可能把A类和B类都放在D类的头部。所以,D类的一个成员函数指针不仅要说明要指明调用的是哪一个函数,还要指明使用哪一个this指针。编译器知道A类占用的空间有多大,所以它可以对Athis增加一个delta=sizeof(A)偏移量就可以将Athis指针转换为Bthis指针。

  综上所述,为了支持一般形式的成员函数指针,需要至少三条信息:函数的地址,需要增加到this指针上的delta位移量,和一个虚拟函数表中的索引。对于VC6.0来说,还需要第四条信息:虚拟函数表(vtable)的地址。另外,对虚拟继承可能还要特别处理,而在多继承的情况下,很多时候成员函数指针已经变成了一个结构体,这时要正确调用该指针就变得格外困难。当然,解决所有这些问题已经超出了这篇文章的范围。

  参考文献:

  [1]"MemberFunctionPointersandtheFastestPossibleC++Delegates",DonClugston

  [2]《直接调用类成员函数地址》,南风.



月期刊平台服务过的文章录用时间为1-3个月,依据20年经验,经月期刊专家预审通过后的文章,投稿通过率100%以上!
  • 论文中英文摘要怎么写?中英文摘要写作要求

    2025-04-03
    一篇高质量的论文,中英文摘要的撰写是非常重要的,否则会直接影响论文的发表。那么, 论文中英文摘要怎么写 ?今天在这里为大家讲讲 中英文摘要写作要求 ,希望能够帮助到大家。 1、中文摘要与关键词 推荐提供报道性摘要(结构式摘要),一般300-500字,分目的、方法
  • 评职称出书/选电子书号还是纸质书号

    2025-04-03
    有过评职称经验的作者,应该了解电子书号和纸质书号,电子书号,音像出版社出的书,有ISBN号,五CIP,国家网站可查询,是正规书号;纸质书号,有ISBN和CIP也是正规书号。至于 评职称出书/选 电子书号还是纸质书号 ?通常选择纸质书号的较多,但不同评审单位要求不同,
  • 评职称发表论文有什么要求?可以评职称的期刊目录

    2025-04-02
    工程、医生、会计和教师评副高和高级职称,通常需要发表论文、出版著作或申请专利,参评者可根据单位评审文件准备适合的学术成果。以下是为大家介绍的 评职称发表论文有什么要求 ?以及 可以评职称的期刊目录 ,供大家参考: 一、评职称发表论文有什么要求 1、论文质量
  • 教师评职称,通过率90%的北大核心期刊推荐

    2025-04-02
    无论你是中学、高中还是高校老师,职称晋升是必不可少的,为了能够帮助你快速完成职称晋升,今天在这里为教师们推荐部分通过率90%的北大核心期刊,供大家参考: 1、《思想政治教育研究》 复合影响因子 3.131,主要发表思想政治教育理论和实践相关文章,探索新时代思想
  • sci论文外审一般多长时间?三个月没消息正常

    2025-04-01
    sci论文审稿过程包括初审、外审和终审,其中外审周期较长。至于, sci论文外审一般多长时间 ? 并没有固定的时间,具体要看期刊的要求、论文的质量、审稿人的时间等等,通常sci论文外审的平均周期通常为2-4个月不等,甚至更久,具体以目标sci期刊外审时间为准。 1、sci
回到顶部