首页 > 编程语言 >C++面经:C++多态-----虚函数、虚函数表、虚函数指针、虚继承

C++面经:C++多态-----虚函数、虚函数表、虚函数指针、虚继承

时间:2022-11-09 22:23:08浏览次数:54  
标签:函数 对象 子类 多态 C++ 父类 指针

1.虚函数引入类中之后,类会发生什么变化?

首先我们创建一个空类A,然后创建一个类的对象a,并打印它的占用空间大小 ---为1

 

 

 

我们再往类中添加两个成员函数后,再返回对象a的占用空间大小发现还是1

说明类A 的普通成员函数不占用类对象的内存空间

 

 

如果我们在类中添加一个虚函数后,对象的占用空间大小就变成 4

说明在添加虚函数之后,编译器会向类中插入一个看不见的成员变量(虚函数表指针vptr)virtual table pointer ---4字节 而它占用类对象a的内存空间

 

 

 

2.虚函数表的生成时机和生成原因:

当类A中至少存在一个虚函数时,在编译期间,编译器就会为类A生成一个虚函数表virtual table(vtbl)

 

 

 

 

 

 

 

 

 虚函数表会一直伴随类A一直到内存中

 

3.虚函数表指针被赋值的时机

 

虚函数表指针与虚函数表的关系:

 

 

 

 

对于含有虚函数的类A ,编译器会在编译过程中在构造函数中穿插为虚函数表指针赋值的语句

 

使得虚函数表指针指向虚函数表

 

 

 

4.类对象在内存中的布局:

完整的类A对象代码:

 

 

 

 连接方式与布局:

虚函数指针指向虚函数表,虚函数表包含所有虚函数的指针

 

 

 

5.虚函数的工作原理,多态性的体现:

多态的体现:

父类子类拥有同名虚函数的情况下

父类指针new一个*子类对象或者通过父类引用来绑定一个&子类对象时

父类中,使父类指针或者引用去调用虚函数

那么实际调用的是子类的虚函数

 

 

 两个方面理解多态:

原则:

 

 

 

代码实现上:

如果是 vptr -> vtbl -> 虚函数 这个路线 那么就体现了多态性  (用对应的汇编代码查看调用情况)

直接像普通成员函数调用就不是多态

 

 

 

表现形式上:

原则:

 

 

示例:

 

 

布局:(存在override覆盖现象)

 

标签:函数,对象,子类,多态,C++,父类,指针
From: https://www.cnblogs.com/slowlydance2me/p/16875399.html

相关文章

  • 常见内置函数
    #1.匿名函数#lambda变量名:返回值#2常见内置函数ll=map(lambdax:x**2,[xforxinrange(10)ifx%2==0])print(list(ll))#[0,4,16,36,64]l2=zip([1,2,3......
  • mysql导入数据函数问题
    1418-ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAin项目场景:mysql创建function报错误1418-ThisfunctionhasnoneofDETERMINISTIC,N......
  • JavaScript函数
     JavaScript函数JavaScript函数概念    可以储存一段代码的数据类型- 分为两个阶段:函数定义阶段和函数调用阶段- 1.函数定义阶段:把代码放进“盒子”,函数里面代......
  • 764. 最大加号标志 ----- 动态规划、C++ STL:无序set容器unordered_set、分类思想
    在一个nxn的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1。mines[i]=[xi,yi]表示 grid[xi][yi]==0返回 grid中包含 1 的最大......
  • C++中如何实现创建文件夹
    C++中如何实现创建文件夹:使用system()调用dos命令#include<iostream>usingnamespacestd;intmain(){stringfolderPath="E:\\database\\testFolder";......
  • 函数指针和函数指针类型
    函数指针1.     定义每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。注意:函数指针的本质是一个指针变量,且指针指向的函数......
  • 判断文件或文件夹(目录)是否存在(状态) C/C++ win/linux通用
    一、windows下使用_access()或linux下使用access()函数判断文件状态windows下使用_access()函数所在头文件:<io.h>函数原型:int_access(constchar*_Filename,int_Acces......
  • Python函数-6
    一.函数的嵌套函数的嵌套就是一个函数内还有多个函数而且函数内部的变量在函数外部不能运行如果一个变量在外部函数和内部函数都有,且代码块在内部函数里,就会优先执行函......
  • Net6 反射反射程序员的快乐/遍历属性、字段、构造方法、函数及相关操作
    十年河东,十年河西,莫欺少年穷学无止境,精益求精反射反射,程序员的快乐,利用反射可以获取到私有属性及其值 在C#中反射无处不在,用好反射,就可以为所欲为有这么一个学生类:......
  • 每次调用这个函数(num)运行增加1
    #include<stdio.h>voidAdd(int*p){(*p)++;}intmain(){intnum=0;Add(&num);printf("%d\n",num);Add(&num);printf("%d\n",num);Add(&num);printf("%d\n",nu......