两种情况
一 派生类不使用new
二 派生类使用new
派生类不使用 new
前提 : 基类使用了new,派生类不使用 new
结果 : 不需要给派生类定义显式的析构函数,复制构造函数,赋值运算符.
原因:
析构函数: 派生类的默认析构函数进行的操作: 执行自身的代码后调用基类析构函数. 因为派生类 不使用 new,则派生类的构造函数 不需要执行任何特殊的操作,所以 默认析构函数 ok.
复制构造函数:
对派生类: 默认复制构造函数只进行成员的复制,不会 new 新的空间,而此时派生类 不需要 new空间,所以 对派生类是合适的.
对基类: 复制类成员或继承的类组件时,使用的是该类复制构造函数完成的.即 在此时使用的是 基类的复制构造函数.
即 : 默认的复制构造函数 ok.
赋值运算符:
对派生类: 由于不需要 new 空间,所以默认的赋值运算符 ok.
对基类: 当对基类组件赋值时,派生类的默认赋值运算符将自动使用基类的赋值运算符.
即: 默认的赋值运算符 也 ok.
综上所述: 当派生类 不使用 new是, 不需要给派生类定义显式的析构函数,复制构造函数, 赋值运算符.
派生类使用 new
前提 : 基类使用了 new,派生类也使用了 new
结果 : 需要给派生类定义显式的析构函数,复制构造函数,赋值运算符.
原因:
析构函数: 由上知,默认的析构函数在操作完成后,自动调用基类的析构函数. 但 派生类本身 new 的空间还没有释放,造成内存泄露. 即: 需要定义派生类本身的 析构函数,用来释放派生类的构造函数 new 的空间.
复制构造函数:
对派生类:默认的复制构造函数 只能进行成员的复制,不会new 空间,所以需要定义复制构造函数.
对基类: 同上.
即: 需要定义派生类本身的 复制构造函数,用来进行空间复制,而不是简单的成员复制
定义派生类的复制构造函数时, 可以通过使用基类的复制构造函数 来处理 共享的基类数据.
赋值构造函数:
对派生类: 由于默认的赋值构造函数不能new 空间,所以需要定义赋值构造函数.
对基类: 同上.
在写 赋值构造函数时: 用于派生类 不能处理 基类的数据,可以通过 显式调用 基类赋值运算符处理 基类的数据.