【发布时间】:2013-02-14 14:57:55
【问题描述】:
我开始在 C++0X/11 中使用智能指针,但遇到了一种特殊情况。 我想使用 shared_ptr 向上转换一个对象的实例。
Extend 类继承自 Base 类,其中 Base 类具有一个虚拟析构函数以使其具有多态性(否则 dynamic_pointer_cast 会抱怨非多态类转换)。
如果因此:
std::shared_ptr<Base> obj = std::make_shared<Base>();
然后我做:
obj = std::dynamic_pointer_cast<Extend>(obj);
- 安全吗?
- 指向该对象的其他指针会发生什么情况?是不是只有obj把它当成Extend,而其他共享指针还是把它当成Base?
- 向上转换同一个实例是否安全,或者我应该执行其他操作吗?
编辑:感谢您的回答。我问这个问题的真正原因是使用 SAX 解析器处理 XML 文档,但我被向上/向下转换迷惑了。 我想要的是:
std::shared_ptr<Extend> ex = std::dynamic_pointer_cast<Extend>(obj);
obj = ex;
但这一点意义都没有,我只会使用对象工厂。
【问题讨论】:
-
给定 B 类 {}; class D : B {} 从 B* 到 D* 的转换是 down 转换,而从 D* 到 B* 的转换是 up 转换。我觉得你有相反的方向。
标签: c++ c++11 shared-ptr upcasting