C++ 在虚拟继承的情况下,如何向下转换共享的\u ptr?

C++ 在虚拟继承的情况下,如何向下转换共享的\u ptr?,c++,shared-ptr,downcast,virtual-inheritance,C++,Shared Ptr,Downcast,Virtual Inheritance,假设我有一个类C,继承自B,其本身实际上继承自a: class A {}; class B : virtual public A {}; class C : public B {}; 现在假设我有一个std::shared\u ptr管理一个对象,我确信该对象属于继承B的某个类(例如,类C),我甚至碰巧将其作为原始B指针提供,其方式相当于下面的最小示例: B * pb = new C; std::shared_ptr<A> spa(pb); 看起来是的,但我希望得到更了解情况的人

假设我有一个类
C
,继承自
B
,其本身实际上继承自
a

class A {};
class B : virtual public A {};
class C : public B {};
现在假设我有一个
std::shared\u ptr
管理一个对象,我确信该对象属于继承
B
的某个类(例如,类
C
),我甚至碰巧将其作为原始
B
指针提供,其方式相当于下面的最小示例:

B * pb = new C;
std::shared_ptr<A> spa(pb);
看起来是的,但我希望得到更了解情况的人的确认(我以前从未使用过别名构造函数)

以下代码是实现我的目标的适当方法吗

std::shared_ptr<B> spb(spa, pb);
对。在这两种情况下(您的备选方案和
动态\u指针\u cast
),您将获得一个
共享的\u ptr
谁是
操作员->
将返回对
B
的引用。在这两种情况下,当所有引用都被销毁时,将调用对象
A
。在所有方面,他们的行为都是一样的

这也意味着,如果您没有在
a
中定义
virtual
析构函数,那么在这两种情况下,删除
a
后代码都会中断


也就是说,在这种情况下使用
动态指针\u cast
并没有什么“过分”的地方。

Thx!是的,
A
确实有一个虚拟析构函数(与此继承层次结构中的所有类一样)。所谓“过度杀戮”,我的意思是,在我不需要RTTI的情况下,使用RTTI的开销似乎是多余的。