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

Yon*_*onk 3 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);
       }
}
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息:

错误C2664:'Base <T> :: funcA':无法将参数1从'void(__ thiscall Child ::*)(char)'转换为'void(__thiscall Base <T> ::*)(char)'

AnT*_*AnT 9

您的代码无效.

首先,在C++中创建一个指向成员函数的指针,你总是必须使用operator &和一个成员的限定名,这意味着你的调用funcA应该如下所示

funcA(&Child::funcToCall); // close, but not yet, see "secondly" 
Run Code Online (Sandbox Code Playgroud)

其次,成员指针是逆变的.如果要使用derived-member指针值初始化基本成员指针对象,则必须使用显式static_cast

funcA(static_cast<fptr>(&Child::funcToCall));
Run Code Online (Sandbox Code Playgroud)

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

第三,为了通过这样的指针调用函数,你必须在左侧提供一个具体的对象,所以调用funcA应该如下所示(我假设你想为*this对象调用它)

(this->*FuncToCall)('a');
Run Code Online (Sandbox Code Playgroud)

第四,你funcToCall应该有一个参数.它在哪里?