我的调试虚函数表.docx
上传人:sy****28 上传时间:2024-09-14 格式:DOCX 页数:5 大小:72KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

我的调试虚函数表.docx

我的调试虚函数表.docx

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

调试之类的实现——虚函数表机制#include<stdio.h>classJCDad{public:JCDad(intage):m_age(age){}virtual~JCDad(){}virtualvoidprint(){staticintcount;count++;printf("Hey,thisisdadandI'm%d.\n",m_age);printf("\tthecountis:%d.\n",count);}private:intm_age;};classJCSon:publicJCDad{public:JCSon(intage):JCDad(55),m_age(age){}virtual~JCSon(){}virtualvoidprint(){printf("Hey,thisissonandI'm%d.\n",m_age);printf("mydadsaid:");JCDad::print();}private:intm_age;};intmain(){JCDaddad(50),*pdad;JCSonson(21),*pson;dad.print();son.print();son.JCDad::print();pdad=&son;//pson=&dad;//error:cannotconvertfromJCDad*toJCSon*,requiresreinterpret_castpdad->print();//pdad->JCSon.print();//error:JCSonis'tamemberofJCDad//pson->print();return0;}===============================================================================运行结构如下:如下给出两个对象的变量窗口:son.print()dad.print()如下给出给个成员的存储空间:&dad=0x0012ff6c------------------------------|&dad.m_age=0x0012ff70|---------sizeof(dad)=8&dad+1=0x0012ff74--------------------------|&son=0x0012ff5c&son.JCDad::m_age=0x0012ff60---------|&son.m_age=0x0012ff64|---------sizeof(son)=12&son+1=0x0012ff68--------------------------|如下给出了指针赋值后的变量窗口:pdad->print()总结:从count变量的输出可以看出两个对象共享函数JCDad::print(),而从成员变量的地址空间可以看出两个对象拥有独立的地址空间而且空间大小不一定就是成员变量的空间大小之和,可能是考虑到数据对齐的缘故吧。其实这是必然的,从函数的调用就可以发现。书中的原话是“同一个类的所有对象共享同一个成员函数的地址空间,而每个对象有独立的成员变量地址空间。也可以这样说成员函数式类拥有的,成员变量是类的对象拥有的”从对象的变量窗口中可以看出两个对象具有独立的虚函数表入口,在调用虚函数的时候就是通过这个表索引得到的经调试事实上virtual只需要在父类中申明就可以了,而且该virtual可以一直继承下去。但是考虑到代码的维护的问题因此可以在每个继承关系链上都添加virtual作为申明。注意到虚函数表指向的是指针值得最近链类对象的函数第二层派生类第一层派生类基类下面给出了实例的内存图:&son&dadJCDad::vftableJCDad::m_ageJCSon::vftableJCDad::m_ageJCSon::m_ageJCDad::print()地址JCSon::print()地址JCDad::destructor地址JCSon::destructor地址参考文献:VisualC++权威剖析——MFC的原理、机制与开发实例辛、王编著