虚析构函数

如果一个类会作为基类使用,就必须把它的析构函数设为虚函数,否则通过基类指针删除派生类对象会是未定义行为。

只要一个类显式定义了析构函数(包括虚析构函数,即使是 =default),在这个类及其派生类中,编译器都不会自动生成移动构造函数和移动赋值运算符。

如果还想要移动操作,就要手动写出来或默认声明它们。

合成拷贝控制与继承

合成的拷贝控制函数会自动处理对象的创建、复制和销毁,先处理基类的成员,再处理派生类的成员。

如果基类的拷贝控制函数被删除或不可访问,派生类的相关拷贝控制函数也会被删除。

如果基类没有移动构造函数,派生类也不能默认有移动构造函数。如果派生类想要支持拷贝或移动操作,它必须自己实现这些操作,并且处理好基类部分的拷贝或移动。

派生类的拷贝控制成员

和派生类的构造函数一样,当派生类定义了拷贝或移动操作时,该操作负责拷贝或移动包括基类部分成员在内的整个对象。

但析构函数只负责销毁派生类自己分配的成员,基类部分的析构会被自动调用执行。

拷贝构造函数

通常直接使用基类的拷贝构造函数初始化基类部分,但要在初始化列表显式调用。

拷贝赋值运算符

拷贝赋值也要在函数体内显式调用基类赋值运算符,否则不会自动调用。

析构函数

基类析构函数可以被自动调用。