简体   繁体   English

shared_ptr中的dynamic_cast?

[英]dynamic_cast across a shared_ptr?

I have two classes A and B, B inherits from A. 我有两个A和B类,B继承自A.

If I have a shared_ptr<A> object which I know is really a B subtype, how can I perform a dynamic cast to access the API of B (bearing in mind my object is shared_ptr, not just A? 如果我有一个shared_ptr<A>对象,我知道它实际上是一个B子类型,我怎样才能执行动态转换来访问B的API(请记住我的对象是shared_ptr,而不仅仅是A?

If you just want to call a function from B you can use one of these: 如果您只想从B调用函数,可以使用以下方法之一:

std::shared_ptr<A> ap = ...;
dynamic_cast<B&>(*ap).b_function();
if (B* bp = dynamic_cast<B*>(ap.get()) {
    ...
}

In case you actually want to get a std::shared_ptr<B> from the std::shared_ptr<A> , you can use use 如果你真的想从std::shared_ptr<A>获得std::shared_ptr<B> ,你可以使用

std::shared_ptr<B> bp = std::dynamic_pointer_cast<B>(ap);

use dynamic_pointer_cast 使用dynamic_pointer_cast

example copied from above link 从上面链接复制的示例

// static_pointer_cast example
#include <iostream>
#include <memory>

struct A {
  static const char* static_type;
  const char* dynamic_type;
  A() { dynamic_type = static_type; }
};
struct B: A {
  static const char* static_type;
  B() { dynamic_type = static_type; }
};

const char* A::static_type = "class A";
const char* B::static_type = "class B";

int main () {
  std::shared_ptr<A> foo;
  std::shared_ptr<B> bar;

  bar = std::make_shared<B>();

  foo = std::dynamic_pointer_cast<A>(bar);

  std::cout << "foo's static  type: " << foo->static_type << '\n';
  std::cout << "foo's dynamic type: " << foo->dynamic_type << '\n';
  std::cout << "bar's static  type: " << bar->static_type << '\n';
  std::cout << "bar's dynamic type: " << bar->dynamic_type << '\n';

  return 0;
}

output 产量

foo's static  type: class A
foo's dynamic type: class B
bar's static  type: class B
bar's dynamic type: class B

可能最好的方法是使用标准函数来转换shared_ptr

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM