问题
I have two classes A and B, B inherits from 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?
回答1:
If you just want to call a function from B
you can use one of these:
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<B> bp = std::dynamic_pointer_cast<B>(ap);
回答2:
use 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
回答3:
Probably the nicest way would be to use the standard functions for casting a shared_ptr
来源:https://stackoverflow.com/questions/23795265/dynamic-cast-across-a-shared-ptr