C++使用functional bind能否强制将this指针转换为其他类类型?
关于std::bind绑定跨类成员函数时this类型的疑问
你猜的完全没错——没办法强制让std::bind传入A*类型的this来绑定B::newFunc,咱们来拆解一下背后的原因:
首先得明确std::bind绑定非静态成员函数的规则:当你绑定一个类T的成员函数时,bind要求传入的对象指针/引用必须能被转换成T*类型。这是因为C++的非静态成员函数天生就和所属类绑定——它的隐式第一个参数就是该类的this指针,类型固定为T*(针对非const成员函数)。
看你给出的代码:
myA->myFunc = bind(&B::newFunc, (B*)myA);
这里&B::newFunc是B类的成员函数,它要求的this指针类型是B*,所以你必须把myA(A*类型)强制转成B*才能让bind通过编译。这种做法本质上是在“欺骗”编译器,让它误以为这个A对象是B对象,但A和B之间没有任何继承或布局关联,属于典型的未定义行为——代码能跑只是运气好,一旦编译器优化、内存布局变化,随时可能崩溃。
这也确实违背了C++的核心设计原则:this指针和成员函数所属的类是强关联的,目的就是保证类型安全——成员函数是为所属类的对象设计的,访问的是该类的成员,强行用其他类的对象指针当this,等于绕过了编译器的类型检查,风险极高。
如果你的需求是让A的myFunc调用B的函数,同时能安全访问A的成员,有两种更合理的做法:
- 让
B::newFunc显式接收A*参数,绑定的时候把myA传进去:
class B { public: B() { A* myA = new A(); // 这里绑定B的成员函数,同时传入当前B对象指针和A对象指针 myA->myFunc = bind(&B::newFunc, this, myA); } void newFunc(A* a) { // 直接用a访问A的成员,完全不需要转换this // a->some_member = ...; } };
- 如果业务逻辑允许,让
B继承自A(比如class B : public A),这时候A*转B*虽然需要动态转换,但至少是符合C++类型系统的安全操作(前提是多态类)。
总的来说,你最初那种强行转换this类型的做法既不安全,也不符合C++的设计理念,换成显式传参或者合理的类继承关系才是正确的方向。
内容的提问来源于stack exchange,提问作者user1300214
相关产品推荐
相关产品推荐

