如果基类使用动态内存分配,派生类不使用
|
|
那么是否要为ship类定义显示析构函数,复制构造函数,重载赋值运算符呢? 不需要.
析构函数: 对于ship类,我们没有对他进行任何特殊的操作,所以默认的析构函数是合适的
复制构造函数:
首先我们知道的是,默认复制构造函数是执行成员复制,因为player使用了动态内存分配,所以,默认复制构造函数不适用于player类,但对于ship类是适合的.当复制继承的组件获或者成员时,则使用他的复制构造函数.所以当ship的默认复制构造函数会使用player的默认复制构造函数来复制ship里的player对象.所以默认复制构造函数对于他们来说是合适的.赋值运算符: ship默认的赋值运算符也会使用player的赋值运算符来对player成员进行赋值,所以是合适的.
如果基类和派生类都使用动态内存分配
|
|
在这种情况下必须显示定义派生类的显示析构函数,复制构造函数,重载赋值运算符.
析构函数: 派生类的析构函数先释放type所管理的内存,然后基类析构函数释放name所管理的内存.
复制构造函数:
派生类的复制构造函数只能访问派生类的数据,所以他必须调用父类的复制构造函数.ship::ship(const ship & p) : player(p) , 因为player类因为复制构造函数有一个player&参数,而基类可以指向派生类型,因此player的复制构造函数将使用ship参数的player部分来构造新对象的player部分.赋值运算符:
因为派生类采用动态内存分配,所以他需要一个显示赋值运算符.ship的赋值运算符只能直接访问ship类的数据,但他却要负责所继承的基类对象的赋值,这个时候可以显示调用基类的赋值运算符方法.然后在处理派生类的赋值.
1234567 ship & ship::operator=(const player & p){if(this == p) return *this;player::operator=(p);//显示调用基类赋值运算符delete type;type = new string;type = p.type;}