我想要做的是:
将指向B类方法的指针指向父类A作为参数
的方法class A{
typedef void(A::*METHOD);
void executeMethod(METHOD arg){};
}
class B : A{
void sampleMethod(){};
void childMethod(){
this->executeMethod(&B::sampleMethod); //<== error
}
}
然而,这会在代码块中出现以下错误:
error: no matching function to call for 'B::executeMethod(void B::*)'
这有什么办法吗? 还有什么我需要做的才能让你清楚,我想要完成什么?
答案 0 :(得分:2)
问题在于sampleMethod
不是A
的成员,而是“{1}}的成员,无法转换为B
}。
您是否考虑过使用虚拟方法?
答案 1 :(得分:2)
typedef void(A::*METHOD);
将METHOD
定义为类型void*
的指针到A
的成员变量,而不是指向A
的成员函数的指针。
你需要:
typedef void (A::*METHOD)();
即使进行了这项更改,您也无法使用B
的成员函数作为预期METHOD
的参数传递。
您可以创建要传递A
虚拟成员函数的函数并使用它。
class A {
protected:
typedef void(A::*METHOD)();
void executeMethod(METHOD arg){};
public:
virtual void sampleMethod() = 0;
};
class B : public A {
virtual void sampleMethod(){};
void childMethod(){
this->executeMethod(&A::sampleMethod);
}
};
答案 2 :(得分:2)
您不能直接从基类调用子方法,但可以使用template:
class A {
public:
template<class T>
void executeMethod( void (T::*method)() )
{
(static_cast<T *>( this )->*method)();
}
};
class B : public A {
public:
void sampleMethod() {}
void childMethod() { executeMethod( &B::sampleMethod ); }
};
但更灵活的解决方案是使用std::function
和std::bind
,因为您可以传递签名不匹配的方法。
class A {
public:
typedef std::function<void()> Method;
void executeMethod( const Method &method )
{
method();
}
};
class B : public A {
public:
void sampleMethod1() {}
void sampleMethod2( int param ) {}
void childMethod1() { executeMethod( std::bind( &B::sampleMethod1, this ); }
void childMethod2() { executeMethod( std::bind( &B::sampleMethod2, this, 123 ); }
};
答案 3 :(得分:1)
要使可调用对象绑定到成员函数,您应该使用std :: bind。这将创建一个转发包装器,它将调用sampleMethod及其预先指定的一些参数。在这种情况下,“this”参数将被绑定。
std :: bind(&amp; B :: sampleMethod,this);