C++抽象类-多态-对象内存映像(转载后修改)

        每一个具有虚函数的类叫做多态类(抽象类?)。C++为每一个多态类至少创建一个虚函数表(vtable),它其实是一个函数指针数组,其中存放着这个类所有的虚函数的地址,包括继承下来但未改写的虚函数及该类的类型信息。

      每一个抽象类的对象都有一个隐含的指针成员(即vptr),它指向所属类型的vtable,,程序中通过基类指针或引用对虚函数的调用语句都会被编译器改写成如下的形式:(即:利用基类的指针指向派生类对象,调用派生类对象的函数--->实现多态性。)

     (*(p -> _vptr[slotNum]))(p, arg-list);

     其中:p是基类型指针,_vptr是p指向的对象的隐含指针,而slotNum就是你调用的虚函数在vtable中的编号,这个数组元素的索引号在编译时就确定了下来。

C++对象的内存映像:

      1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。

      2.静态数据成员被提取出来放在程序的静态数据区内为该类所有对象共享,一次仅存一份。

      3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类的所有对象共享,因此每一个成员函数也只存在一份代码实体。

      因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。

增加了继承和虚函数的类的对象模型变得更加复杂,规则如下:

     1.派生类继承基类的非静态数据成员,并作为自己对象的专用数据成员。

     2.派生类基础基类的非静态成员函数,并像自己的成员函数一样访问。

     3.为每一个多态类创建一个虚函数指针数组vtable,该类的所有虚函数的地址都保存在这张表中。

     4.多态类的每一个对象中安插一个指针成员vptr,其类型为指向函数指针的指针,它指向所属类的vtable;vptr是C++对象的隐含数据成员之一。

     5.为了支持RTTI,为每一个多态类创建一个type_info对象,并把其地址保存在vtable中的固定位置。

C++处理函数的方式:

       在编译器里,同一个函数只存在一个实现,不管是全局函数还是成员函数。对于两个源文件中分别定义的两个完全相同的static全局函数,由于编译器认为它们是不同的函数,会分别为它们产生可执行代码。

      C++通过Name-Mangling技术把每一个非静态成员函数都转换成了名字唯一的全局函数,并把通过对象、指针或引用对每一个成员函数的调用语句改写为相应的全局函数调用语句。例如Rectangle类的函数SetLength被编译器改写后的样子可能是:

 void _Rectangle_SetLength_2F_pf(Rectangle *this, float length)
 {
  this->m_length = length;
 }

    因此调用语句rect.SetLength(100.5);被编译器改写成:

   ::_Rectangle_SetLength_2F_pf(&rect1, 100.5);

处理静态成员:

      类的静态成员都不依赖于对象的存在而存在,也就不需要通过对象来访问,因此在本质上就是一种全局变量或函数。

类的静态数据成员可以在class的定义中直接初始化,但这只是声明并给它提供一个初值而已,还必须在某一个源文件中把它定义一次(即分配内存)。

     静态成员函数不需要this指针。

【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值