Day-10
问题
为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 构造函数可以是虚函数吗?
参考答案
为什么析构函数必须是虚函数?
将被继承的父类的析构函数设置为虚函数后,可以保证在new
申请一个子类对象,并使用基类指针指向该对象,当释放该基类指针时可以保证子类的析构函数被执行,从而释放子类的空间,避免内存泄露。
为什么C++默认的析构函数不是虚函数?
因为虚函数需要额外的虚函数表和虚表指针,需要占用额外的内存,只有当作为父类时才会将析构函数设置为虚函数,这样可以避免不必要的内存浪费。
构造函数可以是虚函数吗?
参考:
构造函数不能是虚函数,这里摘取构造函数为什么不能是虚函数中的回答:
构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。
虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。