C++ Smart Pointers 和“与继承有关的”类型转换

     我们真正想要知道的是如何能够使“smart pointer classes的行为”在“与继承相关的类型转换”上,能够和dumb pointers一样。答案很简单:不能够。Daniel Edelson 指出:smart pointers虽然smart,却不是pointers。是的,我们所能做的最好情况就是使用member templates来产生转换函数,然后再在其中出现模棱两可的时候使用转型动作。这并不完美,但是够好。Smart pointers提供了精巧的功能,而“必须使用转型动作以避免模棱两可”则是我们有时候必须付出的一个小代价。

 

    下面看一下代码,便一目了然:

#include <iostream> using namespace std; //Smart Pointer class template <class T> class SmartPtr { public: SmartPtr(T* realptr = 0); T* operator -> () const; T& operator * () const; //转换函数,如果去掉,fun()函数由于参数类型不匹配,编译不过! template<class newType> operator SmartPtr<newType>(); private: T* pointer; }; template<class T> SmartPtr<T>::SmartPtr(T* realptr = 0):pointer(realptr) { } template<class T> inline T& SmartPtr<T>::operator *() const { return *pointer; } template<class T> inline T* SmartPtr<T>::operator ->() const { return pointer; } template<class T> template<class newType> SmartPtr<T>::operator SmartPtr<newType>() { return SmartPtr<newType>(pointer); } class A { public: A(string s):str(s) {} private: string str; }; class B:public A { public: B(string s):A(s) {} }; void fun(const SmartPtr<A>& pmp,int num) { //cout<<*pmp<<num<<endl; } int main() { SmartPtr<A> obj1(new A("class A")); SmartPtr<B> obj2(new B("class B")); fun(obj2,10); system("pause"); return 0; } 

你可能感兴趣的:(C++ Smart Pointers 和“与继承有关的”类型转换)