继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数,这样我们就能动态分配继承体系中的对象了。
如前所述,当我们delete一个动态分配的对象的指针时将执行析构函数。如果该指针指向继承体系中的某个类型,则由可能出现指针的静态类型与被删除的动态类型不符的情况。例如,如果我们delete一个Quote*类型的指针,则该指针有可能实际指向了一个Bulk_quote类型的对象。如果这样的话,编译器就必须清楚它应该执行的是Bulk_quote的析构函数。和其它函数一样,我们通过在基类中将析构函数定义成虚函数以确保执行正确的析构函数版本:
class Quote { //如果我们删除的是一个指向派生类对象的基类指针,则需要虚析构函数 virtual ~Quote() = default; //动态绑定析构函数 };
和其它虚函数一样,析构函数的虚属性也会被继承。因此,无论Quote的派生类使用合成的析构函数还是定义自己的析构函数,都将是虚析构函数。只要基类的析构函数是虚函数,就能确保当我们delete基类指针时将运行正确的析构函数版本: