虚析构函数
继承关系对基类拷贝控制最直接的影响是基类要定义一个虚析构函数,这样我们才能动态分配继承体系中的对象.
当我们delete
一个动态分配的对象的指针时将指向析构函数.如果该指针指向继承体系中的某个类型,则有可能出现指针的静态类型与被删除对象的动态类型不符的情况.
析构函数的虚属性会被继承.只要基类的析构函数是虚函数,就保证了delete
基类指针会运行正确的析构函数版本:
Quote *itemP = new Quote;
delete itemP;
itemP = new Bulk_quote;
delete itemP;
如果基类的析构函数不是虚函数,则
delete
一个指向派生类对象的基类指针将产生未定义行为.
虚析构函数阻止合成移动
如果一个类定义了虚析构函数,即使它通过=default
的形式使用合成版本,编译器也不会为这个类合成移动操作.