指向父类的成员函数的函数指针

时间:2010-12-08 13:10:20

标签: c++ function-pointers

我一直在尝试理解C ++中的函数指针,以便我可以在我的一个项目中成功使用它们。我遇到了逻辑问题。假设我们有两个类:父类和继承父类的子类。

class Parent{
    ...other stuff
   void (Parent::*ptr2func) ();
    ...other stuff
};

然后我们有一个儿童班:

class Child : public Parent{
       ...other stuff
       void afunc();
       ...other stuff
};

我想将父类的指针连接到子类的afunc()函数。在子类的构造函数中,我试图这样做:

  Child::Child()
  {
    ptr2func = &Child::afunc;
  }

这返回了预期的错误: 无法在作业中将void (Child::*)()转换为void (Parent::*)()

我担心会发生这样的事情。但是我该如何克服这个呢?我不能将父类的成员函数的函数指针链接到子类的成员函数吗?正如您所理解的那样,我试图通过函数指针实现多态性,仅用于实验而不使用虚函数。我一直相信这是可能的。我的错是什么?或者这是不可能的?

2 个答案:

答案 0 :(得分:5)

void (Parent::*)()采用Parent类型的对象。函数Child::afunc需要Child类型的对象。因此,将指针转换为void (Parent::*)()将允许无效调用。

成员函数指针实际上不能用于实现多态。在不使用virtual的情况下实现多态的传统方法是使用常规函数指针:

struct MyBaseClass
{
    void (*function)(MyBaseClass* this_pointer);
};

答案 1 :(得分:2)

如果转换工作会很危险,因为您可以使用指针或对父类型的引用来调用类Child中的函数,该父类可能不是Child类型。

如果你传入一个函数和一个指针/引用,你可以使用boost :: bind来实现它。