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)'
您的代码无效.
首先,在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应该有一个参数.它在哪里?
| 归档时间: |
|
| 查看次数: |
2903 次 |
| 最近记录: |