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的开销似乎是多余的。