1> 派生类不使用new
class baseDMA{
private:
char * label;
int rating;
public:
baseDMA(const char *l = "null", int r = 0);
baseDMA(const baseDMA & rs);
virtual ~baseDMA();
baseDMA & operator = (const baseDMA & rs);
...
}
class lacksDMA : public baseDMA
{
private :
char color[40];
public:
....
}
不需为派生类定义显示的复制构造,析构,赋值符号等从操作
派生类的默认构造函数,编译器将自定义默认的构造函数要进行一些操作: 执行之自身的代码后调用基类 的析构函数。
1> 派生类不使用new
class baseDMA{
private:
char * label;
int rating;
public:
baseDMA(const char *l = "null", int r = 0);
baseDMA(const baseDMA & rs);
virtual ~baseDMA();
baseDMA & operator = (const baseDMA & rs);
...
}
class hashDMA : public baseDMA
{
private :
char *style;
public:
....
}
在这种情况下必须使用派生类显示析构函数,复制构造函数和复制操作等
派生类析构函数自动调用基的析构函数,所以自身的指责是对派生类构造函数执行工作的清理。所以hasDMA析构函数必须释放style管理的内存,应依赖于baseDMA的析构函数来释放lable管理的内存。
所以
baseDMA :: ~baseDMA(){ delete [] lable;}
hasDMA :: ~hasDMA(){delete [] style;}
hasDMA的复制构造函数只能访问hasDMA的数据。它必须调用baseDMA复制构造函数来共同处理