您的位置:首页 > 编程语言 > C语言/C++

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

2011-06-07 22:23 405 查看
我们真正想要知道的是如何能够使“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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: