【C++】shared_from_this() be ambiguous
哎呦,搞C++的朋友们,有没有遇到过这种情况:父类和子类都继承了 std::enable_shared_from_this,结果在子类里调用 shared_from_this() 时,拿到的竟然是父类的指针,还报了个 std::bad_weak_ptr 的错误?这就像你去买汉堡,结果服务员给你一个面包,你内心OS:肉呢?肉呢?
问题来了,为啥会这样?其实,这是因为 shared_from_this() 的实现机制决定它只能返回调用它的对象的类型指针。如果子类和父类都继承了 std::enable_shared_from_this,编译器就懵了:你到底要我返回哪个?于是,它干脆给你个父类的指针,结果你发现:这不对啊!
那怎么解决呢?大神给了个建议:别让子类继承了,只让父类继承,然后在子类里用 shared_from_this() 时,做个类型转换。就像这样:std::static_pointer_cast<子类>(shared_from_this())。这招就像是你直接告诉服务员:我要的是汉堡,别给我面包!
最后,思考一下,C++的这种设计是不是有点“你猜我猜大家一起猜”的感觉?不过也正因为这种灵活性,我们才能在复杂的继承体系中找到解决问题的办法。所以,下次再遇到类似问题,别慌,冷静分析,总能找到出路的。
- 如果父类继承了 std::enable_shared_from_this
- 子类也继承了 std::enable_shared_from_this
- 那么,在子类里获取 shared_from_this 拿到的是 父类,会报错
B::insertme
terminate called after throwing an instance of \'std::bad_weak_ptr\'what(): bad_weak_ptr*/
- 子类需要把自己的shared ptr 传递给方法用,此时必须做转换
- 大神的分析
- 说子类不继承,只让父类继承:
- 子类如果用 shared frome this ,要做个转换
父类转为子类C的 :
std::static_pointer_cast