我有一个我想解决的特殊问题,我不确定它是否可能,因为我找不到任何信息或它的例子。 基本上,我有:
class ParentObject {};
class DerivedObject : public ParentObject
{
void myFunction(){}
};
class OtherDerivedObject : public ParentObject
{
void myOtherFunction(){}
};
并且需要一个指向ParentObject :: *的函数指针,并且能够从派生类中获取函数。 我想要这样做的原因,我有另一个班级
class functionRegistry
{
std::map<string, *functionPoint> functionMap;
}
并且每个对象(理想情况下在ParentObject中但在必要时可以在派生对象中单独执行)具有functionRegistry的实例,并且我需要functionPoint能够指向DerivedObject或OtherDerivedObject类型的对象中的函数。
提前致谢
答案 0 :(得分:3)
您只需要static_cast
以正确的类型填充地图。
using pfunc_type = void (ParentObject::*)() ;
pfunc_type pfunc1 = static_cast<pfunc_type>(&DerivedObject::myFunction);
标准允许这样做:
[expr.static.cast / 12] - §5.2.9¶12
类型为“指向cv1 T类型D的成员的指针”的prvalue可以是 转换为类型为“指向cv2 T类型B的成员的指针”的prvalue, 其中B是D的基类(Clause [class.derived]),如果cv2是 与cv1.72相同的cv资格,或更高的cv资格。如果 没有从“指向T类型B的成员的指针”的有效标准转换 到“指向T类型D的成员的指针”存在([conv.mem]),程序 是不正确的。转换空成员指针值([conv.mem]) 到目标类型的null成员指针值。如果是B级 包含原始成员,或者是基类或派生类 包含原始成员的类,生成指向成员的指针 指向原始成员。否则,行为未定义。 [ 注意:虽然B类不需要包含原始成员,但是 通过指针间接的对象的动态类型 成员执行必须包含原始成员; 请参阅 [expr.mptr.oper]。 - 结束说明]
但是虽然允许这样做,但您必须非常小心,以确保将指针应用于具有正确动态类型的对象上的成员。