您有Animal
和和Dog
(Dog
从那里继承Animal
)的两个类,并且您遇到的情况是经常期望有动物,但正在发送狗的实例。在我的特定情况下,我经常将强力指针(std::shared_ptr<Dog>
)转换为期望动物的函数(std::shared_ptr<Animal>
)。
如果我们接受可以将函数参数作为引用(std::shared_ptr<Animal>&
,避免使用参数,因为担心更改线程的所有权,为什么不应该将强指针作为引用参数),则我认为我们可以安全地在内存类型上进行强制转换。std::shared_ptr<Dog> dog
使用reinterpret_cast<std::shared_ptr<Animal>&>(dog)
,对吗?
如果是这样,除了线程问题之外还会发生什么?例如参考计数品种?
明确地说,目的是要有一种可以在很多情况下使用的解决方案,在这种情况下,一次转换并不是真正可行的解决方案。更为重要的是,必须铸造许多对象。同样,忽略它std::unique_ptr
可能是一个更好的解决方案,也可能不是一个更好的解决方案。
为了增加最终的要求,在使用std::shared_ptr
通用的序列化器类函数(它是虚拟的,因此无法进行模板化)的情况下,使用普通指针将不允许我更改原始指针。
我经常在使用强力指针(
std::shared_ptr<Dog>
)来表示期望动物的功能(std::shared_ptr<Animal>
)。
无需强制转换(即显式转换)。指向派生类型的共享指针可以隐式转换(1)到指向基类的共享指针。
(a)如果我们接受可以将函数参数作为参考
如果满足一些要求,我们只能接受此假设。首先,该函数不得将引用的参数存储在该函数的范围之外(通过复制除外)。其次,作为引用传递的指针必须是本地的或临时的-否则,该函数不得调用任何可以直接或间接访问引用的指针的函数。
还请考虑,如果引用是非常量的,则您不能依赖隐式转换(1)。而是必须创建一个单独的正确类型的共享指针(可以使用隐式转换来创建它并传递它。const引用参数或非引用参数都不会出现此问题。
(b)我以为使用std :: shared_ptr狗是安全的
reinterpret_cast<std::shared_ptr<Animal>&>(dog)
,所以对吗?
从标准的角度来看,您建议的演员表并不安全-行为不确定。我看不出假设(b)是如何从假设(a)得出的。
如果在您的情况下可以使用对shared_ptr的引用作为参数,但是由于转换(派生为基,非const为const)而无法避免refcounter的递增/递减,则建议改用裸指针作为参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句