虚析构函数与继承中的拷贝控制
虚析构函数
如果一个类会作为基类使用,就必须把它的析构函数设为虚函数,否则通过基类指针删除派生类对象会是未定义行为。
只要一个类显式定义了析构函数(包括虚析构函数,即使是 =default),在这个类及其派生类中,编译器都不会自动生成移动构造函数和移动赋值运算符。
如果还想要移动操作,就要手动写出来或默认声明它们。
合成拷贝控制与继承
合成的拷贝控制函数会自动处理对象的创建、复制和销毁,先处理基类的成员,再处理派生类的成员。
如果基类的拷贝控制函数被删除或不可访问,派生类的相关拷贝控制函数也会被删除。
如果基类没有移动构造函数,派生类也不能默认有移动构造函数。如果派生类想要支持拷贝或移动操作,它必须自己实现这些操作,并且处理好基类部分的拷贝或移动。
派生类的拷贝控制成员
和派生类的构造函数一样,当派生类定义了拷贝或移动操作时,该操作负责拷贝或移动包括基类部分成员在内的整个对象。
但析构函数只负责销毁派生类自己分配的成员,基类部分的析构会被自动调用执行。
拷贝构造函数
通常直接使用基类的拷贝构造函数初始化基类部分,但要在初始化列表显式调用。
拷贝赋值运算符
拷贝赋值也要在函数体内显式调用基类赋值运算符,否则不会自动调用。
析构函数
基类析构函数可以被自动调用。
评论