指向派生类的成员函数的指针,但不是派生(虚拟)函数

时间:2016-12-27 15:25:30

标签: c++ inheritance function-pointers member-function-pointers

我有一个我想解决的特殊问题,我不确定它是否可能,因为我找不到任何信息或它的例子。 基本上,我有:

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类型的对象中的函数。

提前致谢

1 个答案:

答案 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]。 - 结束说明]

但是虽然允许这样做,但您必须非常小心,以确保将指针应用于具有正确动态类型的对象上的成员。