当前位置: 首页 > news >正文

有了域名就可以做网站了吗个人网站主办者名称

有了域名就可以做网站了吗,个人网站主办者名称,没营业执照怎么做网站,百度竞价防软件点击软件C是如何实现多态的结论#xff1a;C通过虚函数来实现多态的#xff0c;根本原因是派生类和基类的虚函数表的不同。 构成多态的必要条件有如下3点#xff1a; 存在继承关系基类存在虚函数#xff0c;且派生类有相同原型的函数遮蔽它存在基类类型的指针指向派生类对象… C是如何实现多态的结论C通过虚函数来实现多态的根本原因是派生类和基类的虚函数表的不同。 构成多态的必要条件有如下3点 存在继承关系基类存在虚函数且派生类有相同原型的函数遮蔽它存在基类类型的指针指向派生类对象且该指针调用了存在遮蔽关系的虚函数 如下图就是一个简单的多态的例子实验环境:vs2019 大猪眉头一皱觉得事情并不简单。 针对上述实验结果有个疑点 基类指针是如何知道要调用派生类的f函数而不是基类的f函数的呢 这其中的奥秘还是要从内存模型开始探索。谈到内存模型那么我们先探讨最简单的——这个对象有多大吧或者说这个对象占几个字节的内存吧。 如上图所示A的大小在32位编译模式下是4字节在64位编译模式下是8字节由此可见A内存模型里面肯定有个指针原因https://blog.csdn.net/qq_18138105/article/details/105209406 那么继续深入分析对象的内存模型这个指针到底指向什么呢 实际上这个指针指向一个数组数组中的每个元素都是虚函数的入口地址这个数组也就是虚函数表存在于C内存模型中的常量区由于虚函数表和对象在内存上是分开存储的(虚函数在C内存模型中的代码区对象在C内存模型中的堆区指向对象的指针在C内存模型的栈区)因此就需要在对象中需要安插一个指向这个虚函数表的指针 我们再看一个例子 各个对象的内存模型如下(我用cocos creator画的) 如上图所示对象内存和虚函数表内存分开的对象的*vfptr指向对应的虚函数表。注意和很多博客画的图不同为了直观我是把处于内存高地址的放上面处于内存低地址的放下面 仔细观察派生类B的虚函数表 派生类如果存在对基类有遮蔽关系的虚函数则在虚函数表中则取派生类的这个虚函数的入口地址如B::f对于未被派生类遮蔽的基类的虚函数派生类的虚函数表则取基类的这个虚函数的入口地址如A::g派生类新增的虚函数依次往虚函数表后面加如B::h 因此我们通过指针调用虚函数时先根据指针找到对象里的vfptr来定位到虚函数表然后通过虚函数在虚函数表中的索引值来得到虚函数的入口地址。 比如 a-f() 实际上编译器会这么处理 (*(*(a0)0))(a) a0 是 a对象 vfptr 的地址*(a0)是 vfptr的值 又 vfptr 是指向虚函数表的指针因此 *(a0) 也是虚函数表的首地址由于 A::f 函数在虚函数表中的索引是0因此 (*(a0)0)就是获取 A::f 函数的入口地址知道了A::f 函数的地址*(*(a0)0) 就是对 A::f 的调用把a对象的指针传入 A::f, 就是a作为 A::f 的 this指针 同理调用 b-f() 也是一样的只不过访问的是 B的虚函数表最后调用的是 B::f 而不是 A::f 这就解释了 “基类指针是如何知道要调用派生类的f函数而不是基类的f函数” 的问题就是因为虚函数表的不同。 疑问虽然已经解决了但是我们还是要继续细探究竟经过下面的实验得出的 结果和内存模型完全相符 #include iostream using namespace std;class A { public:A() : a(100) {}virtual void f() {cout A::f endl;}virtual void g() {cout A::g endl;} protected:int a; };class B : public A { public:B() : b(50) {}virtual void f() {cout B::f endl;}virtual void h() {cout B::h endl;} protected:int b; };// 定义一个 参数为 A*类型 返回值是 void 的 函数指针 Fun typedef void (*Fun)(A*);// 指针值类型64位编译模式下是long long 32位编译模式下是int #ifdef _WIN64 #define ptr_value long long #else #define ptr_value int #endif // 根据对象指针和偏移量 获取 指针值类型的指针 #define ptr(obj, offset) ((ptr_value*)objoffset)int main() {A* a new A;A* b new B;// 接下来探究 a对象 和 b对象 的 内存模型 //ptr_value a_vfptr_value *ptr(a, 0); // a_vfptr的值 即 b的虚函数表的首地址((Fun)*ptr(a_vfptr_value, 0))(a); // A::f((Fun)*ptr(a_vfptr_value, 1))(a); // A::g ptr_value a_a *ptr(a, 1); // a对象 的 int a成员cout (int)a_a endl; // 100ptr_value b_vfptr_value *ptr(b, 0); // b_vfptr的值 即 b的虚函数表的首地址((Fun)*ptr(b_vfptr_value, 0))(b); // B::f((Fun)*ptr(b_vfptr_value, 1))(b); // A::g ((Fun)*ptr(b_vfptr_value, 2))(b); // B::hptr_value b_a *ptr(b, 1); // b对象 的 int a成员cout (int)b_a endl; // 100ptr_value b_b *ptr(b, 2); // b对象 的 int b成员cout (int)b_b endl; // 50return 0; }因此只要理解了虚函数表C的多态自然就迎刃而解了。
http://www.huolong8.cn/news/60300/

相关文章:

  • 建设银行网站怎么先无贷款呢安徽专业网站建设检修
  • 制作网站上海电话销售企业网站怎么做
  • ps课堂网站注册一个网站需要多少钱
  • 西宁做网站建设公司哪家好产品宣传图册
  • 网站后台分模块网站免费建站方法
  • 网站点击率多少正常属于您自己的网站建设
  • 旅游网站域名应该如何设计徐州个人建站模板
  • 12306网站开发语言玉环做网站有哪些
  • 湖北专业网站建设维修电话网络平台的推广方法
  • 公司网站无法打开专业北京网站建设公司哪家好
  • 如何做网站浏览pdf江门建站公司模板
  • 阿里巴巴网站建设做爰片的网站
  • 淘特app官方网站下载汉中建设工程招标网最新公告
  • 网站标题优化可以含几个关键词网站定制哪家比较好
  • 做网站的 简历杭州知名网站建设
  • 网站建设中管理员登录的代码怎么写怎么建立一个网站卖东西
  • 百度和阿里哪个厉害做网站微商怎么做分销
  • 网站建设seo 视频教程全球新冠疫苗接种率
  • 心理网站建设策划书最新手机网站推荐
  • 怎么做网站播放器wordpress中文手册
  • 做软件与做网站建设有什么区别霸州做网站的
  • 网站死链接提交黄页网络的推广
  • 做美食哪些类型网站小型企业网方案设计5000字
  • 网页设计做网站首页上海企业网络推广价格
  • 济南营销网站建设会qt怎么做网站
  • 网站框架类型食品网站建设目的
  • 外贸网站建设哪里实惠默认开启评论 wordpress
  • 凡科建站弊端最吸引人的汽车广告语
  • 苏州网络推广苏州网站建设九九建筑网66kv架空线路设计视频讲座
  • 做海报推荐网站开发区官网