C++ 多态 虚函数

来源:互联网 发布:模仿神烦狗doge软件 编辑:程序博客网 时间:2024/06/14 00:41

C++编译器在编译时创建数据结构,以便在执行时支持多态。多态是通过三个层次的指针(三层间接访问)实现

第一层: 当C++编译包含一个或者多个虚函数的类时,会为这个类建立一个vtable(虚函数表)(C++中实现基类虚函数的子类的函数也是虚函数)。每当调用这个类的虚函数,正在执行的程序都会利用这个vtable选择选择合适的函数实现  (最左边) vtable中存放的是函数指针  vtable中的函数指针指向调用虚函数执行的实际函数 它是指针链的最后一环



第二层: 只要实例化带有一个或者多个虚函数的类的类对象时,编译器就会将这个对象链接到指向这个类的vtable的指针 注意是vtable指针 就是指针链的第二环


第三层:简单包含接收虚函数调用的对象句柄,这个层次的句柄也可以是应用 


终于明白指针的概念,在单片机中,51是8位,指针是式8位的,可以寻址2的8次方  在计算机中 PC机是32位 指针式32位 每个指针占4个字节 



结合图片 调用虚函数  编译器产生的代码执行如下几个操作(首字母小写表示对象 大写表示类)

1.选择employee中第i项,(这里即为hourlyEmployee的对象指针),并将它作为实参传递给函数,这就将baseClassPtr参数设置成了指向hourlyEmployee

2.解除这个指针的引用,获得hourlyEmployee对象。这个对象以一个指向HourlyEmployee类的vtable的指针开始

3.解除引用hourlyEmployee对象的vtable指针获得HourlyEmployee类的vtable

4.跳过4个字节的偏移量,选择print函数指针(由于print函数指针在vtable中排在第二位 跳 过第一个函数指针 共4个字节)

5.解除print函数的指针引用,形成要执行的实际函数的名称


调用每个虚函数时的指针解除引用操作和内存访问,都需要一些额外的执行时间,添加到对象的vtable和vtable指针,也需要额外的操作

由此来判断是否适合使用虚函数




原创粉丝点击