以下的内容全部出自《C++ Primer Plus(第六版)中文版》13.7章节,继承和动态内存分配。


当基类和派生类都采用动态内存分配时,派生类的析构函数、复制构造函数、赋值运算符都必须使用相应的基类方法来处理基类元素

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
class baseMDA
{
private:
char * label; // 在构造函数中使用new
int rating;

public:
baseDMA(const char * l = "null", int r = 0);
baseDMA(const baseDMA & rs);
virtual ~baseDMA();
baseDMA & operator=(const baseDMA & rs);
...
};
1
2
3
4
5
6
7
8
class hasDMA : public baseDMA
{
private:
char * style; // 在构造函数中使用new

public:
...
};
  1. 对于析构函数,这是自动完成的
    派生类析构函数自动调用基类的析构函数,故其自身的职责仅对派生类中构造函数执行的工作进行清理。
1
2
3
4
hasDMA::~hasDMA()
{
delete [] style;
}
  1. 对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数完成的
1
2
3
4
5
6
baseDMA::baseDMA(const baseDMA & rs)
{
label = new char[std::strlen(rs.label) + 1];
std::strcpy(label, rs.label);
rating = rs.rating;
}
1
2
3
4
5
hasDMA::hasDMA(const hasDMA & hs) : baseDMA(hs)
{
style = new char[std::strlen(hs.style) + 1];
std::strcpy(style, hs.style);
}

这里

  1. 对于赋值运算符,这是通过使用作用域解析运算符显式地调用基类的赋值运算符来完成的
1
2
3
4
5
6
7
8
9
10
11
baseDMA & baseDMA::operator=(const baseDMA & rs)
{
if (this == &rs)
return *this;

delete [] label;
label = new char[std::strlen(rs.label) + 1];
std::strcpy(label, rs.label);
rating = rs.rating;
return *this;
}