首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

基类调用子类成员函数指针遇到的有关问题

2012-12-17 
基类调用子类成员函数指针遇到的问题本帖最后由 AngryPowman 于 2012-12-03 02:37:14 编辑Delegate基类代

基类调用子类成员函数指针遇到的问题
本帖最后由 AngryPowman 于 2012-12-03 02:37:14 编辑 Delegate基类代码:


template <typename T>
class Delegate
{
protected:
typedef void (T::*DelegateFunctionPtr)(const ExtraData* data);

public:
virtual void execute(uint32 id, const ExtraData* extraData)
{
DelegateTable::iterator iter = _delegateTable.find(id);
if (iter != _delegateTable.end())
{
DelegateFunctionPtr func = iter->second;
(T::*func)(extraData);
}
}
// ...

子类代码:

class DelegateTest : public Delegate<DelegateTest>
{
public:
void _delegateTest(const ExtraData* data)
{
cout << "Delegate Test" << endl;
}
};

调用:

int main(int argc, char* argv[])
{
DelegateTest delegateTest;
delegateTest.execute(1, NULL);
}


子类继承Delegate特化之后,这样定义的函数指针类型的实例在基类应该怎么调用(指针指向子类的成员函数)?有人有过这样的需求吗?

注:上面代码中省略了部分细节,我的意图是希望调用基类Delegate的execute方法之后可以调用到子类DelegateTest中的_delegateTest函数。Delegate的execute方法实际上只是在一个map里面找到相应的函数指针进行调用,函数指针指向子类的_delegateTest方法。

编译错误信息如下:

2>f:\athena\src\utils\delegate\delegate.h(69): error C2059: 语法错误:“<tag>::*”
2>          f:\athena\src\utils\delegate\delegate.h(64): 编译类 模板 成员函数“void Delegate<T>::execute(uint32,const ExtraData *)”时
2>          with
2>          [
2>              T=DelegateTest
2>          ]
2>          f:\athena\test\testframework\testsuit.h(15): 参见对正在编译的类 模板 实例化“Delegate<T>”的引用
2>          with
2>          [
2>              T=DelegateTest
2>          ]

比较纠结的问题,先睡了,希望明早起来可以看到答复,求夜猫大神发功。
[最优解释]
调用的时候需要子类对象,这个例子里,可以通过类型转换调用,

(static_cast<T*>(this)->*func)(extraData);

但是这不是通用方法,因为没有保证实例化类型就一定子类类型。楼主既然用虚函数,就一直用虚函数呗,何必拿模板绕圈子呢。
[其他解释]
(T::*func)(extraData); 你得调用错误了。
成员函数指针的调用 一定要有一个对象或者指向对象的指针来调用。
比如
T obj;
(obj.*func)(extraData);
[其他解释]
推荐楼主看下《深度探索C++对象模型》和《C++ STL源码剖析》,不然很多生僻的C++语法会让你头疼的。

热点排行