代理类:
我们需要一个容器,来存储类型不同但彼此相关的对象。
1.抽象基类,所有成员函数为纯虚函数,不能创建这种类型的对象数组。
在声明中对虚函数写=0,明确声明这些函数可以空着不定义。因此,只有从这个抽象基类派生出来的类才能够实例化,这个抽象基类本身不会有对象。既然抽象基类对象不存在,当然也就不可能有其对象数组。
2.抽象基类。成员函数没有纯虚函数,可以创建这种类型的对象数组,但是不能和派生类进行转换。
将一个派生类对象赋给这个基类对象的数组元素,会导致把派生类对象转换成一个基类对象,同事会丢失掉所有在积累中没有的成员。等于将派生类进行了裁剪放入数组中去。
经典解决方案:
提供一个间接层。
最早的合适的间接层形式就是存储指针,而不是对象本身。定义抽象基类类型的指针数组,将派生类对象取地址赋予数组元素进行存储。
问题在于:
1.当派生类对象是局部变量的时候,一旦出了这个局部,那么数组中元素的指向变成不确定的了。
当然我们可以在局部去new一个该对象的副本,然后存储这个副本对象的地址。这会造成动态内存管理的负担。
2.另外,当两个元素指向同一个对象的时候,会出现释放的问题...
虚复制函数:
在抽象基类中定义一个纯虚函数,例如 virtual BaseClass* copy() const = 0;
在每个派生类vp中新增了一个新的成员函数copy, vp->copy()会获得一个指针,该指针指向该对象的一个新建副本。如 BaseClass DerivedClass::copy() const { return new DerivedClass(this)}。当然处理完一个对象之后,需要清楚掉该对象。那么我们要确保BaseClass类有一个虚析构函数。
定义代理类:
BaseClassSurrogate默认构造函数
BaseClassSurrogate拷贝构造函数
BaseClassSurrogate拷贝BaseClass构造函数
BaseClassSurrogate赋值操作符函数
补上其它函数