我开始在 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;
但这根本没有意义,我将只使用对象工厂。