如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将如何影响派生类的实现呢?这取决于派生类的属性,如果派生类也使用动态内存分配,这将如何实现呢?这种大致分为两种情况,
  第一种情况:派生类不使用new
  这将不需要在派生类中显式的定义析构函数,复制构造函数,赋值操作符。如果在派生类中没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数,实际上,派生类的默认构造函数总要进行一些操作:执行自身的代码后调用基类析构函数。因为派生类没有任何特殊操作,所以使用默认析构函数是合适的。
  接下来看复制构造函数,默认复制构造函数执行成员复制,这对于动态内存分配来说是不合适的,但对于派生类成员来说是合适的,因此只需要考虑继承的基类对象,成员复制将根据数据类型采用相应的复制方式,复制类成员或者集成的类组件的时候,则是使用该类的复制构造函数完成的。所以,派生类的默认复制构造函数使用显式基类复制构造函数来复制派生类对象的基类部分。因此,默认复制构造函数对于新的派生类成员来说是合适的,同时对于继承的基类对象来说也是合适的。
  对于赋值来说,累的默认赋值操作符将自动使用基类的赋值操作符来对基类组件进行赋值。因此,默认的赋值操作符也是合适的。
  派生类对象的这些属性也适用于本身是对象的类成员。
  第二种情况:派生类使用new
  在这种情况下,必须为派生类定义显式析构函数,赋值操作符,复制构造函数。
  派生类析构函数自动调用基类的析构函数,所以他自身的职责是对派生类构造函数执行工作进行清理。因此,派生类析构函数必须释放为变量动态分配的内存,并依赖于基类的析构函数来释放为基类变量动态分配的内存。
  派生类的复制构造函数只能访问派生类的数据,因此它必须调用基类复制构造函数来处理共享的基类数据。需要注意的是,成员初始化列表将一个派生类引用传递给基类构造函数,没有参数类型为派生类引用的基类构造函数,也不需要这样的构造函数。因为基类的复制构造函数有一个基类的引用参数,而基类引用可以指向派生类型。因此,基类复制构造函数将使用派生类参数的基类部分来构造新对象的基类部分。
  接下来看赋值操作符,由于派生类也使用动态内存分配,所以它也需要一个显式赋值操作符。作为派生类的方法,它只能直接访问派生类的数据,然而,派生类的显式复制操作符必须负责所有继承的基类对象的复制,可以通过显式调用基类赋值操作符来完成这项工作。
  总之,当基类和派生类都采用动态内存分配的时候,派生类的析构函数,复制构造函数以及赋值操作符都必须使用相应的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的,对于析构函数,这是自动完成的;对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的,如果不这样做,将自动调用基类的默认构造函数,对于赋值操作符,这是通过使用作用域操作符显式的调用基类的赋值操作符来完成的。