指向父类成员函数的函数指针
Posted
技术标签:
【中文标题】指向父类成员函数的函数指针【英文标题】:Function pointers to member functions of a parent class 【发布时间】:2010-12-08 13:10:19 【问题描述】:我一直在尝试理解 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::*)()
。
我担心会发生这样的事情。但是我该如何克服呢?我不能将链接到子类的成员函数吗?正如你所理解的,我试图通过函数指针来实现多态性,只是为了进行实验而不使用虚函数。我被引导相信这是可能的。我的错误是什么?还是根本不可能?
【问题讨论】:
您真正想做什么?您已经设置了继承方案;你为什么不使用virtual
函数来获得多态行为,而不是尝试使用函数指针来破解某些东西?
C++ inheritance and member function pointers的可能重复
我同意 Karl Knechtel 的说法。 virtual
关键字已经让编译器为您完成所有艰苦的工作。
致卡尔:我只是不想使用问题中所述的虚函数。我想了解什么是可能的,什么是不可能的。对查尔斯:是的,那里的解释似乎真的很好。
【参考方案1】:
void (Parent::*)()
采用 Parent 类型的对象。函数Child::afunc
需要一个 Child 类型的对象。因此,将指针转换为void (Parent::*)()
将允许无效调用。
成员函数指针不能真正用于实现多态性。不使用 virtual 实现多态的传统方式是使用常规函数指针:
struct MyBaseClass
void (*function)(MyBaseClass* this_pointer);
;
【讨论】:
如果Child::afunc
是父级中虚函数的覆盖,它会起作用吗?
哦,所以通过传递一个指向类对象的指针作为我们想要实现多态性的每个函数的参数,这可以实现是吗?【参考方案2】:
如果这种转换工作会很危险,因为您可以使用可能不是 Child 类型的 Parent 的指针或引用来调用 Child 类中的函数。
如果你传入一个函数和一个指针/引用,你可以使用 boost::bind 来实现它。
【讨论】:
以上是关于指向父类成员函数的函数指针的主要内容,如果未能解决你的问题,请参考以下文章
继承与多态C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
C++|详解类成员指针:数据成员指针和成员函数指针及应用场合