基类的函数指针指向子类的成员函数?

时间:2010-10-13 01:10:46

标签: c++ inheritance function-pointers

我知道这听起来令人困惑,我有一个基本模板类,它有一个函数指针,一个子类(不再是模板类)需要使用该函数指针指向子类的成员函数,并且我遇到各种错误..我是否违反了一些C ++的普遍规律? 这是伪代码:

template <class T>
class Base{
    public:
       typedef void (Base<T>::*fptr) (char in);
       void funcA(fptr FuncToCall){
                 FuncToCall('a');
       }
       ...
    };

class Child:public Base<char>{
   public: 
       void funcToCall(){...}
       void funcB(){
          funcA(funcToCall);
       }
}

以下是我收到的错误消息:

  

错误C2664:'Base&lt; T&gt; :: funcA':不能   从'void转换参数1   (__thiscall Child :: *)(char)'to'void   (__thiscall Base&lt; T&gt; :: *)(char)'

1 个答案:

答案 0 :(得分:9)

您的代码无效。

首先,在C ++中创建指向成员函数的指针,总是必须使用运算符&和成员的限定名,这意味着您对{{{ 1}}应如下所示

funcA

其次,成员指针是逆变。如果要使用derived-member指针值初始化基本成员指针对象,则必须使用显式funcA(&Child::funcToCall); // close, but not yet, see "secondly"

static_cast

请注意,这是一个有效但可能不安全的转换,因为现在您有责任确保在调用的左侧使用的实际对象(请参阅“第三个”)具有该成员。

第三,为了通过这样的指针调用函数,你必须在左侧提供一个具体的对象,所以funcA(static_cast<fptr>(&Child::funcToCall)); 中的调用应该如下所示(我假设你想要将其称为funcA对象)

*this

第四,你的(this->*FuncToCall)('a'); 应该有一个参数。它在哪里?