在构造函数和析构函数中使用虚函数可以实现多态吗?
不能
因为不管是构造函数还是析构函数,其父类和子类的执行都是有一定顺序的,拿构造函数来说,父类的构造函数会先生成(一个很简单的道理,父类再被子类继承后,其已然属于子类的一部分,所以得先构造父类的那部分,才会构造子类的那部分,归结到虚函数指针上来就是,vptr会先指向父类的虚函数,当父类构造完成后,再指向子类的虚函数),因此,在构造父类的时候执行到父类构造函数中的虚函数时,子类还没构造呢,也就无法动态绑定到子类那,只会执行父类自己的虚函数,也就无法实现多态。析构函数中也是如此,子类的析构会先于父类执行(这点可以这么想,子类继承了父类,父类是子类中不可缺少的一部分,如果先解决了父类,那子类也就不完整了,所以正确的解决顺序应当是先子类析构再父类析构),在执行到父类的析构函数时,子类已经被析构完成了,其析构函数中定义的虚函数自然也就无法下降到(我一直觉得下降到这个词语用的很精妙)子类去执行,也就无法实现动态绑定,实现多态。
这是有继承关系下的构造函数和析构函数的调用顺序,并且,析构应当是虚析构,借着上面这个问题,可以引出第二个问题。
为什么要使用虚析构函数?
这个问题是有一个产生背景的,当使用一个父类指针去指向一个子类对象的时候,如果父类的析构函数不是虚函数,那么很有可能会造成内存泄漏(如果子类使用new开辟了空间)
因为,一个父类指针去指向一个子类对象,其执行的权限是父类权限,也就是说在析构的时候,其调用的是父类的析构,此时如果父类的析构函数不是一个虚函数,那么他就无法下降到子类去执行子类的析构函数,倘若子类申请了空间,那这片空间就无法得到释放,就会造成内存泄漏。