指向方法父参数c++的子类方法指针
child class method pointer to method parent argument c++
我想看到的可能很奇怪,我会尽可能多地澄清。我在ubuntu 14.04和C++11上使用的是gcc 4.8。
我想尝试做的是:
- 取得a级成绩
- 在类a中生成一个函数作为参数
- 指向同一类的类成员的指针
- 创建一个继承自a的新类B
- 制作B类的新方法
-
将指向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::*)'
有办法解决这个问题吗?我还有什么需要做的吗,让你明白我正在努力实现的目标?
不能直接从基类调用子方法,但可以使用模板:
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 ); }
};
问题是sampleMethod
不是A
的成员,它是B
的成员,无法转换为void(A::*)
。
你是否考虑过使用虚拟方法?
typedef void(A::*METHOD);
将METHOD
定义为指向A
的成员变量的void*
类型的指针,而不是指向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);
}
};
要使一个可调用对象绑定到一个成员函数,您应该使用std::bind。这将创建一个转发包装器,该包装器将使用预先指定的一些参数来调用sampleMethod。在这种情况下,"this"参数将被绑定。
std::bind(&B::sampleMethod,this);
相关文章:
- 如何访问由共享指针保存的类方法?
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将一个类的方法指针存储到另一个类中
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 类方法返回指向具有模板的类成员的指针
- 指向类方法调用的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- C++ - 类方法函数指针unordered_map的初始化器列表
- 如何定义和设置指向模板类方法的功能指针
- 如何在没有虚拟方法的类dynamic_cast指针?
- 将指针传递到类方法
- C++ - 基类函数指针调用的替代方法
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- 如何调用返回类方法指针的类方法
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 尝试获取类方法指针时出现E_NOINTERFACE
- 指向方法父参数c++的子类方法指针
- 给出一个闭包作为"类方法指针"?
- 静态类方法指针数组的正确语法