17 虚指针、虚表、虚函数
1 虚指针、虚表、虚函数
对象C里面有两个m_data1?只要类里面有一个虚函数,那么就会有一个虚指针,类的大小也会多4个字节
继承:不但继承成员,还会继承函数,函数大小没人知道。继承函数继承的是调用权。
类B改写了vfunc1(); B、C都只有2个虚函数。
总共8个函数:如图所示,其中有4个虚函数,那么虚指针和虚函数是怎么关联的呢?通过中间的虚表,问题:续表的地址可以打印出来么?
问题:改写虚函数,需要把virtual关键字给去掉吗?如果去掉,还会有虚指针吗?会,因为父类有虚函数。
(*(p->vptr[n]))(p); // 这段很宝贵
问题:如何在list中放不同类型的对象?(其实也是同一类,shape)
解决:定义指向形状的指针就行了
c风格:if else,如果是圆形、如果是椭圆、如果是三角形.....这样肯定不好,增加新的子类,判断的代码又要重写。
静态绑定:变成call ***(地址) // call是汇编语言的
动态绑定的3个条件:通过指针调用、指针向上转型、调用的是虚函数
以上说的就是多态。(p):这个是this指针。
2 this:
serialize()是给部门B做的。右下角这部分很关键,this指针放到参数里。
3 const(在part1里面已经提过了)
cosnt对象不能调用非const函数,其它情况都可以:
函数重载不必管return type,为什么设计这两个函数呢,reference counting引用计数,4个一样的字符串共享同一个内容
没听懂,以后补上。
a.vfunc1():静态绑定,汇编大略懂就可以了。
动态绑定:call后面不是固定的地址了!
4 new、delete:
5 operator new、operator delete:
6 重载new、delete
7 Basic_String使用new(extra)扩充申请量
以后再补