此问题在此处已有答案:
Downcasting shared_ptr to shared_ptr?(4个答案)
5天前关闭。
假设我有一个抽象类A,只有当A的动态类型是一个继承自B的类时,我才想转换成另一个类B。有没有一种好的方法可以做到这一点,而不需要检查所有可能的中间类(因为在我的实际场景中,有很多中间类)?
换句话说,是否有一些过程可以使下面的代码工作?
#include <memory>
#include <cassert>
struct A
{
virtual void foo() = 0;
};
struct B
{
virtual void bar() = 0;
};
struct C : public A, public B
{
void foo() override {};
void bar() override {};
};
struct D : public A
{
void foo() override {};
};
int main()
{
std::shared_ptr<A> a_ptr_1 = std::make_shared<C>();
std::shared_ptr<A> a_ptr_2 = std::make_shared<D>();
std::shared_ptr<B> b_ptr_1 = /* do something to a_ptr_1 */ nullptr;
std::shared_ptr<B> b_ptr_2 = /* do same thing to a_ptr_2 */ nullptr;
assert(!b_ptr_2);
assert(b_ptr_1);
b_ptr_1->bar();
return 0;
}
字符串
1条答案
按热度按时间qeeaahzv1#
你要找的是
std::dynamic_pointer_cast
:字符串
Try it on godbolt.org的