如下代码使用到std::dynamic_pointer_cast:
#include <iostream>
#include <memory>
class A
{
public:
A(){};
virtual ~A() {};
};
class B: public A
{
public:
B(){};
virtual ~B() {};
void print() { std::cout << "B" << std::endl; };
};
int main()
{
std::shared_ptr<A> a = std::make_shared<B>();
// a->print(); // error
std::shared_ptr<B> b = std::dynamic_pointer_cast<B>(a);
b->print();
return 0;
}
改成如下:
#include <iostream>
#include <memory>
class B;
class A
{
public:
A(){};
virtual ~A() {};
virtual std::shared_ptr<B> GetBPtr() = 0;
};
class B: public A, public std::enable_shared_from_this<B>
{
public:
B(){};
virtual ~B() {};
void print() { std::cout << "B" << std::endl; };
std::shared_ptr<B> GetBPtr() override { return shared_from_this(); };
};
int main()
{
std::shared_ptr<A> a = std::make_shared<B>();
// a->print(); // error
std::shared_ptr<B> b = a->GetBPtr();
b->print();
return 0;
}
修改后不使用std::dynamic_pointer_cast,但是设计上看起来很奇怪,各有选择吧。