1.虚函数表什么时候生成?
编译器编译的时候生成
2.虚函数表存放在哪里?
讨论两种情况:在磁盘(可执行程序)、在内存(运行状态)
实际上不同的编译器把虚函数表放的位置也不同,有放代码段的,也有放在数据段的
3.虚函数表与虚函数表指针的关系
每个类只有一个虚函数(有虚函数的类)
类的不同对象,通常虚函数表指针是不一样的(拷贝构造/opertor=需要深拷贝)
4.虚函数表指针的创建时机
①类对象构造的时候创建虚函数表指针,并且把类的虚函数表地址赋值给vptr
②继承的情况下,虚函数表指针赋值过程?class B : public class A
a.首先调用父类构造函数,把A的虚函数表的地址赋值给vptr
b.然后调用子类构造函数,把B的虚函数表的地址赋值给vptr
5.虚析构函数的作用
背景:析构函数的函数名会被编译器统一处理成destructor,这样函数名就一样了 满足重写条件
重写的函数,哪个类型调用,就调用哪个类型的函数
Father f; f.func(); // 调用父类的
Child c; c.func(); // 调用子类的
Father* pf = new Child; // 因为是父类指针,所以调用父类的
所以父类指针指向子类对象的情况下,在调用析构函数的时候,子类对象的析构函数得不到调用,这样子类的资源肯能得不到释放,造成内存泄漏
在继承下,为了使子类析构函数能够得到正常调用,需要将父类的析构函数设置为虚析构函数
这样父类的析构函数与子类的析构函数构成了虚函数重写,Father* pf = new Child也会调用子类的析构函数