如何使用基类注册派生类成员函数指针

时间:2012-04-08 21:34:22

标签: c++ member-function-pointers

与虚拟成员函数相反,我需要一种解决方案,其中可以注册在每个级别类派生中实现的函数,以供以后基类调用。 (不仅仅是最衍生的实现)

为此,我正在考虑为派生类提供一种机制,以便在基类中注册它们的函数,例如在派生类构造函数中。

我遇到了成员函数指针参数的问题。我以为Derived是从Base派生的,this指针应该自动生成。

这可以接近我正在尝试或者我需要使用静态成员函数void *static_cast吗?

class Base
{
protected:
    typedef void (Base::*PrepFn)( int n );
    void registerPrepFn( PrepFn fn ) {};
}

class Derived : public Base
{
    Derived() {
        registerPrepFn( &Derived::derivedPrepFn );
    };

    void derivedPrepFn( int n ) {};

}

编译错误:

error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))'
note: candidates are:                 'void Base::registerPrepFn(void (Base::*)(int))'

2 个答案:

答案 0 :(得分:12)

如果你需要的只是击败错误信息,那么施法将会:

class Derived : public Base
{
    Derived() {
        registerPrepFn( static_cast<PrepFn>(&Derived::derivedPrepFn) );
    };

    void derivedPrepFn( int n ) {};

}

使用Base* p如果它实际上指向派生)通常称呼它:(p->*registered)(0)

有关工作示例,请参阅http://ideone.com/BB9oy

答案 1 :(得分:0)

oop不允许这样做。行为切换是通过在对象创建时多态化对象的类来完成的。

如果需要后期对象创建行为切换,则可以将动态行为重构为另一组多态类,并将“指针”保存到具有正确行为的类的实例。请谷歌“装饰类”软件模式。