智能指针能够很好的支持类型转换,以及多态的特性,那么智能指针是怎样做到和普通指针一样的功能的?
答案是利用成员函数模板。
如下代码:
我们希望上述的代码能够通过编译,也就是说我们的智能指针类需要实现一个对应版本的拷贝构造函数以及复制运算符重载,但是我们的基类有很多,因此对于这样的要求,相应的拷贝构造函数和复制运算符都应该是模板函数。因此智能指针的基本结构应该如下:
但是,我们的类型转换中并不允许将基类类的指针转换成为派生类,因此,我们应该有有效的机制防止这样转换发生 ,显然我们利用原始指针的转换关系就能完成这样需求。
如果我们传入得参数的原始指针不能转换为相应的接受智能指针的原始指针,那么编译器将会对上述构造函数的初始化报错。这样便有效的防止非法的转换。
成员函数模板的使用不仅仅用于构造函数实现基类和派生类之间的转换,也能用于相似类型的类间的转换,比如不同类型的智能指针。
成员函数模板和编译器生成的拷贝构造不能产生冲突,因此,我们编写相应的模板成员函数的同时,也要编写原本的默认的构造函数的重载。
如下为shared_ptr的实现: