9

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

为此,我正在考虑为派生类提供一种机制,以便在派生类构造函数期间向基类注册其功能。

不过,我在使用成员函数指针参数时遇到了问题。我在想 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))'
4

2 回答 2

15

如果您只需要击败错误消息,那么强制转换就可以了:

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

    void derivedPrepFn( int n ) {};

}

通常用Base* p(如果它实际上指向 Derived ) 调用它:(p->*registered)(0)

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

于 2012-04-08T21:56:23.810 回答
0

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

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

于 2012-04-08T21:54:19.613 回答