我一直在尝试理解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::*)()
。
我担心会发生这样的事情。但是我该如何克服这个呢?我不能将父类的成员函数的函数指针链接到子类的成员函数吗?正如您所理解的那样,我试图通过函数指针实现多态性,仅用于实验而不使用虚函数。我一直相信这是可能的。我的错是什么?或者这是不可能的?
答案 0 :(得分:5)
void (Parent::*)()
采用Parent类型的对象。函数Child::afunc
需要Child类型的对象。因此,将指针转换为void (Parent::*)()
将允许无效调用。
成员函数指针实际上不能用于实现多态。在不使用virtual的情况下实现多态的传统方法是使用常规函数指针:
struct MyBaseClass
{
void (*function)(MyBaseClass* this_pointer);
};
答案 1 :(得分:2)
如果转换工作会很危险,因为您可以使用指针或对父类型的引用来调用类Child中的函数,该父类可能不是Child类型。
如果你传入一个函数和一个指针/引用,你可以使用boost :: bind来实现它。