《C++沉思录》学习笔记二

代理类:

我们需要一个容器,来存储类型不同但彼此相关的对象。

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赋值操作符函数
补上其它函数

代理类1.jpg
代理类2.jpg
代理类3.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容