@c++ dynamic_pointer_cast注意事项
基于Base,Derived这两个具有继承关系的类来写
1.类的代码
class Base {
public:
virtual void CallMe() { std::cout << "Call **Base**" << std::endl; }
};
class Derived : public Base {
public:
virtual void CallMe() { std::cout << "Call **Derived**" << std::endl; }
};
2.回调函数代码
void CallBack(std::function<int(std::vector<std::shared_ptr<Base>>)> cb) {
std::vector<std::shared_ptr<Base>> base_vec;
base_vec.resize(5);
for(size_t i = 0; i < base_vec.size();i++){
std::shared_ptr<Base> base_1 = std::make_shared<Derived>();
base_vec[i] = base_1;
}
int ret = cb(base_vec);
std::cout << "cb value = " << ret << std::endl;
}
3.主函数代码
int main() {
//3.1隐式转换
std::shared_ptr<Base> base = std::make_shared<Derived>();
base->CallMe();
//3.2lamba表达式传递回调函数
auto lamba = [](std::vector<std::shared_ptr<Base>> base_input) -> int {
for (auto& once_base_inpute : base_input) {
auto derived_input = std::dynamic_pointer_cast<Derived>(once_base_inpute);
if (derived_input) {
std::cout << "convert success" << std::endl;
derived_input->CallMe();
} else {
std::cout << "convert failed" << std::endl;
}
once_base_inpute->CallMe();
}
return 1;
};
CallBack(lamba);
3.主函数代码结果
Call **Derived**
convert SUCCESS
Call **Derived**
Call **Derived**
convert SUCCESS
Call **Derived**
Call **Derived**
convert SUCCESS
Call **Derived**
Call **Derived**
convert SUCCESS
Call **Derived**
Call **Derived**
convert SUCCESS
Call **Derived**
Call **Derived**
cb value = 1
4.主函数代码分析
- 定义了一个基类的智能指针指向派生类,调用CallMe()显然会调用派生类的接口
- lamba表达式的输入参数是一个包含Base类的智能指针的vector,但是这个智能指针指向Base还是Derived需要回调函数确定
- 此处的Callback回调函数传递的是指向Derived的Base指针,因此dynamic_pointer_cast转型成功,如果修改成指向Base的Base指针则转型失败
5.总结
dynamic_pointer_cast<(x)>(y)转型的对象y必须是指向x的指针