1.为什么有时要把析构函数变为虚函数
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
虚函数表是属于整个类的,其存储位置跟编译器有关,微软编译器的存储位置为常量段,linux下的编译器在只读数据段。
答:
这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
2.为什么构造函数不能是虚函数
答:(1)
虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行,故构造函数不能是虚函数
3.虚指针和虚函数表分别存储在哪个区域
答:虚指针是属于对象的,在对象的内存空间中,一般是对象的前4个字节