与虚拟成员函数相反,我需要一种解决方案,其中可以注册在每个级别类派生中实现的函数,以供以后基类调用。 (不仅仅是最衍生的实现)
为此,我正在考虑为派生类提供一种机制,以便在基类中注册它们的函数,例如在派生类构造函数中。
我遇到了成员函数指针参数的问题。我以为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))'
答案 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不允许这样做。行为切换是通过在对象创建时多态化对象的类来完成的。
如果需要后期对象创建行为切换,则可以将动态行为重构为另一组多态类,并将“指针”保存到具有正确行为的类的实例。请谷歌“装饰类”软件模式。