第15章 面向对象编程(9)
15.4.3 复制控制和继承
派生类也可以使用合成复制控制成员。合成操作对对象的基类部分连同派生部分的成员一起进行复制、赋值或撤销,使用基类的复制构造函数、赋值操作符或析构函数对基类部分进行复制、赋值或撤销。
只包含类类型或内置类型数据成员、不含指针的类一般可以使用合成操作,复制、赋值或撤销这样的成员不需要特殊控制。具有指针成员的类一般需要定义自己的复制控制来管理这些成员。
1. 定义派生类复制构造函数
如果派生类显式定义自己的复制构造函数或赋值操作符,则该定义将完全覆盖默认行为。被继承类的复制构造函数和赋值操作符负责对基类成分以及类自己的成员进行复制或赋值。
#include "stdafx.h"
#include <iostream>
using namespace std;
class Base
{
protected:
int value1, value2;
protected:
Base(int val1, int val2)
{
value1=val1;
value2=val2;
}
Base(const Base &b)
{
value1=b.value1;
value2=b.value2;
}
};
class Child:Base
{
private:
int value3;
public:
Child(int val1,int val2,int val3):value3(val3),Base(val1,val2){}
Child(const Child &c):value3(c.value3), Base(c){}
};
2. 派生类赋值操作符
如果派生类定义了自己的赋值操作符,则该操作符必须对基类部分进行显式赋值。
Child &operator= (const Child &c)
{
if(this!=&c)
{
Base::operator=(c);
value3=c.value3;
}
return *this;
}
赋值操作符必须防止自身赋值,假定左右操作数不同,则调用Base类的赋值操作符给基类部分赋值。该操作符可以由类定义,也可以是合成赋值操作符,这没什么关系——我们可以直接调用它。基类操作符将释放左操作数中基类部分的值,并赋以来自c的新值。该操作符执行完毕后,接着要做的是为派生类中的成员赋值。
3. 派生类析构函数
析构函数的工作与复制构造函数和赋值操作符不同:派生类析构函数不负责撤销基类对象的成员。编译器总是显式调用派生类对象基类部分的析构函数。每个析构函数只负责清除自己的成员。
对象的撤销顺序与构造顺序相反:首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数。
摘自 xufei96的专栏
补充:软件开发 , C++ ,