子类方法指向方法父参数c ++的指针

时间:2015-02-17 18:28:59

标签: c++ class inheritance methods arguments

我试图看到的可能很奇怪,我会尽可能地澄清。我在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::*)'

这有什么办法吗? 还有什么我需要做的才能让你清楚,我想要完成什么?

4 个答案:

答案 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::functionstd::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);