boost::shared_ptr智能指针父类强转子类怎么转

退学者的游戏 2011-08-13 06:07:38
class A
{
virtual func() = 0;
}

class B :public A
{
func(){}
}

shared_ptr<A> x(new B);

之后 我想再把 x 转为shared_ptr<B> 类型

该怎么转 ? 并且最好告诉下我智能指针强转之后在使用上有什么弊端
...全文
1568 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
印象中有一种“父类转子类”的应用场景,而且也不是绝对的。

那就是子类中有父类没有的函数,用父类只能多态调用,调不了子类专有函数,这时候加个强转可以减少一次子类指针声明和赋值的开销。

但这种场景我一般都是老老实实再声明一个子类指针,这样代码可读性、安全性都更好,而且,基本没有系统会弱到多一个指针的开销都受不了,就算真有这种(如Linux内核,一字节都要挤压),那也轮不到用C++了……
pathuang68 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jackyjkchen 的回复:]

我一直不明白,父类转子类这种蛋疼的需求为什么那么多人问!

正统的多态是子类转父类,用父类动态调用多个子类。

就不能写稍微正常一点的代码么,非搞这种奇技淫巧……
[/Quote]

++

Jacky说得好。

正统的多态是upcasting,即将派生类指针向上转型为基类指针,这是安全的做法。
而downcasting,即将基类指针向下转型为派生类指针的时候,除非基类类型的指针所指的实际对象就是那个要向下转型的派生类,否则是不安全的。
至善者善之敌 2011-08-14
  • 打赏
  • 举报
回复
帮顶吧
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
VC默认的父类转子类支持 /GR都是关闭的,好好想想微软为什么要这样做
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
我一直不明白,父类转子类这种蛋疼的需求为什么那么多人问!

正统的多态是子类转父类,用父类动态调用多个子类。

就不能写稍微正常一点的代码么,非搞这种奇技淫巧……
zzl_acg 2011-08-14
  • 打赏
  • 举报
回复
google boost::static_pointer_cast
dynamic的也有
机智的呆呆 2011-08-13
  • 打赏
  • 举报
回复
4L 5L 请无视吧~~~看错题意了
G_8519 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangsongcui 的回复:]
引用 2 楼 g_8519 的回复:

智能指针销毁时会调用 A 的析构函数 B 的析构函数没有被执行, 我这里是这样的 vs2010

加虚析构函数
[/Quote]

++
zhangsongcui 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 clodfront 的回复:]
class A
{
virtual func() = 0;
}

class B :public A
{
func(){}
}

shared_ptr<A> x(new B);

之后 我想再把 x 转为shared_ptr<B> 类型

该怎么转 ? 并且最好告诉下我智能指针强转之后在使用上有什么弊端
[/Quote]
http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm#functions
static_pointer_cast
多态要求
机智的呆呆 2011-08-13
  • 打赏
  • 举报
回复

auto_ptr<A> ptrA(new B());
auto_ptr<B>ptrB;
ptrB.reset((B*)ptrA.get());
ptrA=ptrB;
机智的呆呆 2011-08-13
  • 打赏
  • 举报
回复

#include <iostream>
#include <vector>
#include <string>
#include <typeinfo>
#include <boost/shared_ptr.hpp>
using namespace std;

class A
{
public:
virtual ~A() {cout<<"~A()"<<endl;}
};
class B :public A
{
public:
~B() {cout<<"~B()"<<endl;}
};

int main()
{
auto_ptr<A> ptrA(new A());
auto_ptr<B>ptrB;
ptrB.reset((B*)ptrA.get());//这么转
ptrA=ptrB;

return 0;
}


zhangsongcui 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 g_8519 的回复:]

智能指针销毁时会调用 A 的析构函数 B 的析构函数没有被执行, 我这里是这样的 vs2010
[/Quote]
加虚析构函数
G_8519 2011-08-13
  • 打赏
  • 举报
回复
智能指针销毁时会调用 A 的析构函数 B 的析构函数没有被执行, 我这里是这样的 vs2010
G_8519 2011-08-13
  • 打赏
  • 举报
回复

class A
{
public:
~A() {}
virtual int get() const = 0;
};
class B :public A
{
public:
~B() {}
B(int value):m_value(value) {}

int get() const
{
return m_value;
}
private:
int m_value;
};

int main()
{
auto_ptr<A> ptr(new B(10));

printf("%d\n", ptr->get());

return 0;
}


智能指针销毁时会调用 A 的析构函数, 我这里是这样的 vs2010

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧