句柄类存储和管理基类指针。
指针所指对象的类型可以变化,既能指向基类类型对象又可以指向派生类类型对象。
用户通过句柄类访问
继承层次的操作 (virtual 函数)
设计考虑因素:
1)对任何保存指针的类一样,必须确定对复制控制的具体操作。包装了继承层次的句柄应该表现得像一个智能指针或者像一个值
2)句柄类决定句柄接口屏蔽还是不屏蔽继承层次。 如果不屏蔽 继承层次,用户必须了解和使用基本层次中的对象。
指针型句柄
1,定义句柄:
三个构造函数:
默认构造函数
、
复制构造函数
和
接受指向基类对象的构造函数
,第三个构造函数将复制基类对象,并保证: 基类对象存在,副本就存在,
两个数据成员: 都是指针, 一个指针指向
基类对象
; 一个指向
使用计数
(多个句柄共享一个计数器)
重载操作符: 解引用操作符:返回 基类指针指向的对象(基类或派生类);
箭头操作符:返回基类指针
2, 使用计数式复制控制: 和智能指针差不多
3, 构造句柄
两个构造函数: 默认构造函数创建未绑定(即该基类指针值为0)的 句柄对象;
上面三个构造函数的第三个(涉及到复制未知类型的操作)因为这构造函数的形参是一个基类的引用,而要根据这个操作创建这个对象的副本, 这个引用是基类的引用,但是可能存储的是派生类的对象。所以,这个基类需要一个接口,可以返回这个引用实际指向的对象,这个涉及到动态绑定-> 什么可以解决过动态绑定 -> 虚函数。所以,下面就是讨论这个虚函数clone.
复制未知类型
解决这个问题 的通用方法是定义虚操作进行复制,该操作命名为clone
基类添加一个clone 函数,为virtual 函数。 继承层次的每个类型都要增加clone函数
clone 函数 : 返回类型: 以本类为副本 构造一个 对象 ,返回指针值。 return new 类名(*this)
通过定义clone 函数,上面的第二个构造函数,只要用形参的基类引用调用clone 函数 就能返回 形参对象副本的指针。
回顾: 虚函数要求基类和派生类里面要完全匹配,但是返回类型可以是基类或派生类,这里明显就显示其大大的前瞻性!!!
个人体会: 我觉得句柄的使用 就是对 C++ 动态绑定的 应用。
C++ 的动态绑定需要两个条件: 1) 继承与虚函数 ;2) 使用基类指针或引用。
所以在程序中用到的最好是基类的指针,然后通过指针去调用虚函数,可以根据具体不同的对象执行各种的虚函数,而单独用指针的话会增加用户的负担,比如指针指向的内存的 申请、释放, 这些指针之间的复制,赋值。所有这些如果都散开来做,将会很蛋疼,所以把这些操作集中起来处理,就有了智能指针和句柄类这样的东西。
所以句柄类 主要要解决的操作有: 怎么通过一个 基类的指针 或 引用(里面存储的可能是基类对象 或 派生类对象)去构造本身 存储指针指向的副本? 就是上面所说的第三个构造函数。 (回顾: 派生类指针或引用可以默认转换到 基类指针或引用,牢牢记住)
复制控制(三种函数一般都要包括)
复制构造函数: 形参为句柄类本身引用的构造函数(注意计数指针的变化);
重载赋值操作符:注意计数指针的变化
析构函数: 复制释放基类指针的内容, 和 计数指针合作,决定什么时候应该删除基类
纯属个人胡扯,有不对的地方,各位大爷不吝赐教