虚函数表的设计和多态的实现
虚函数表
1.包含虚函数的类会有对应的虚函数表,这个表在编译时就初始化好了
2.本质是一个函数指针数组,里面是虚函数的指针
3.该类实例化的对象共用一张虚函数表
4.子类的虚函数表会继承父类的虚函数,如果继承多个父类那就把父类的虚函数合一块
5.重写父类虚函数可以把子类虚函数表中原来的父类的虚函数指针改为现在的子类虚函数指针
6.子类新增的虚函数直接加入子类虚函数表就是
虚函数表指针
1.对象的头4/8个字节就是虚函数表指针
一些问题
1.虚函数表需要对象的指针才可以找到,所以静态成员函数,友元函数玩不了
2.析构函数设为虚函数,在子类虚表中就是子类析构,在多态delete父类指针时,通过去虚表中查找可以正确调用子类析构,避免内存泄漏
3.内联函数和虚函数是冲突的,内联函数会将函数的指令展开在程序中,而虚函数是通过虚表去查找调用
多态的实现
1.引用的底层是指针
2.父类指针既可以指向子类对象也可以指向父类对象
3.无论指向父类对象还是子类对象,调用虚函数都是取头4/8字节的虚函数指针,去查虚表调用对应虚函数