虚函数在哪?虚函数表存那在哪?堆?栈?静态区?代码段?
虚函数和普通函数一样一样,都是存在代码段,同事吧虚函数地址存了一份到虚函数表
虚函数表在哪呢?不会在栈,或栈,堆是动态分配,没有分配和释放
打印虚表的地址
虚函数地址在代码段(常量区)跟下面的普通函数的地址是放在一起的
虚函数的地址一定会被放到虚函数表里面么 ?
重写了fun1所以d中1地址变了2没变(继承下来)但是没有3,4, 5不是虚函数
base不一定是唯一父类,Derive也可能是某个子类的父类
derive的子类也没有fun3,但是可以实现多肽,但是虚表里面没有
这个时候我们应该怀疑监视窗口,监视窗口已经被工程师处理过了
函数指针typedef后类型定义函数指针
打印虚表
其实参数这个地方没有数组只有指针所以传指针
所以虚表里是存了所有函数的
f()通过函数指针调用这个函数((*f)()也可以调用)
&d(derive*)取到derive的地址(包括虚函数指针a,b)转成int*(指针类型决定看多大)取前四个再解引用就是头上的四个字节再强转
然后传给函数指针
如果是64位把int改成long(long不行64位也是4个字节) long
多继承(虚表)
继承了base1和base2重写了func1,有两个虚表 ,因为p1->func1()可能是base1,也可能是base2
直接切片给base2(子类给父类),他放在了第一个虚表
两个虚表重写的func1的地址不同
bc继承A,d继承bc,两张虚表
a里面有虚函数,b,c继承b,c含虚表,d继承b,c,d有两张虚表
如果D里面有个func2他放在第一张虚表里面
_a是公共的有一张表,B,C一个是虚函数表,另一个地址是虚基表计算偏移量指向_a
内联函数 加载虚函数前面
如果是多肽调用就不起作用(该怎么走就怎么走),如果是多肽调用还是直接在执行处展开
静态成员函数没有this指针