发表于|更新于
|阅读量:
以下的内容全部出自《C++ Primer Plus(第六版)中文版》13.7章节,继承和动态内存分配。
当基类和派生类都采用动态内存分配时,派生类的析构函数、复制构造函数、赋值运算符都必须使用相应的基类方法来处理基类元素。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class baseMDA { 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); ... };
|
1 2 3 4 5 6 7 8
| class hasDMA : public baseDMA { private: char * style;
public: ... };
|
- 对于析构函数,这是自动完成的
派生类析构函数自动调用基类的析构函数,故其自身的职责仅对派生类中构造函数执行的工作进行清理。
1 2 3 4
| hasDMA::~hasDMA() { delete [] style; }
|
- 对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数完成的
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 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; }
|
版权声明: 此文章版权归路双宁所有,转载请注明来源作者