目录
1.什么是多态:
2.多态的条件(虚函数)
:1.虚函数的重写
(三同中的参数同指的是类型)
2.父类的指针或者引用去调用
好题:
1.
在编译的时候编译器看到func需要参数 就把func定义时候的参数传递进去了
2. 没有多态就没有多态继承:
3.p指向的仍是B的地址
3.override
(看175注释)
4.抽象类
5.多态原理层
1.虚函数表
2.用程序打印虚表
(typedef一个函数指针原本写法,下一个图才是正确写法)
(void 指针可以指向任意类型的数据)
正确写法 typedef void(*VF_PTR)();
函数参数是函数指针的数组(想想虚表是个啥)
(
这里回忆一下函数指针
指针定义的话就是名字前加*,然后括起来
)
两种写法
(64位下指针是8个字节;得用longlong(8个字节))
类比int去理解: (其实我没有类比,你得清楚传的参数是什么)
对比下面地址,可以看到虚表地址大概在常量区
;;如果继承两个类,有两张表,那么第二张表的地址在哪里?
其实更重要的问题是:如果继承的两个类都没有这个类的虚函数,那么这个虚函数放哪张表里
;;然后有个很深很不容易理解的问题:
func1都重写了,调用的都是子类的func1,为什么两张表中这个函数的地址不一样
ecx修正this指针的位置
6.动态绑定和静态绑定
静态多态是通过重载和模板技术实现,在编译的时候确定。
动态多态通过虚函数和继承关系来实现,执行动态绑定,在运行的时候确定。
7.虚表虚基表的位置![](https://img-blog.csdnimg.cn/4d8de0fdccbf48b9bb06a4b559e6c262.png)
(不用管)虚基表第一个放的是虚表的偏移量,64位下变-8: