c++ 从一个基类到另一个基类的多重继承[复制]

r3i60tvu  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(178)

此问题在此处已有答案

Downcasting shared_ptr to shared_ptr?(4个答案)
5天前关闭。
假设我有一个抽象类A,只有当A的动态类型是一个继承自B的类时,我才想转换成另一个类B。有没有一种好的方法可以做到这一点,而不需要检查所有可能的中间类(因为在我的实际场景中,有很多中间类)?
换句话说,是否有一些过程可以使下面的代码工作?

  1. #include <memory>
  2. #include <cassert>
  3. struct A
  4. {
  5. virtual void foo() = 0;
  6. };
  7. struct B
  8. {
  9. virtual void bar() = 0;
  10. };
  11. struct C : public A, public B
  12. {
  13. void foo() override {};
  14. void bar() override {};
  15. };
  16. struct D : public A
  17. {
  18. void foo() override {};
  19. };
  20. int main()
  21. {
  22. std::shared_ptr<A> a_ptr_1 = std::make_shared<C>();
  23. std::shared_ptr<A> a_ptr_2 = std::make_shared<D>();
  24. std::shared_ptr<B> b_ptr_1 = /* do something to a_ptr_1 */ nullptr;
  25. std::shared_ptr<B> b_ptr_2 = /* do same thing to a_ptr_2 */ nullptr;
  26. assert(!b_ptr_2);
  27. assert(b_ptr_1);
  28. b_ptr_1->bar();
  29. return 0;
  30. }

字符串

qeeaahzv

qeeaahzv1#

你要找的是std::dynamic_pointer_cast

  1. std::shared_ptr<A> a_ptr_1 = std::make_shared<C>();
  2. std::shared_ptr<A> a_ptr_2 = std::make_shared<D>();
  3. auto b_ptr_1 = std::dynamic_pointer_cast<B>(a_ptr_1);
  4. auto b_ptr_2 = std::dynamic_pointer_cast<B>(a_ptr_2);
  5. assert(!b_ptr_2);
  6. assert(b_ptr_1);
  7. b_ptr_1->bar();

字符串
Try it on godbolt.org

相关问题