多继承下函数指针强制转换所引发的诡异问题(CCNotificationCenter)
2014-07-24 14:47
253 查看
函数指针一般来说必须返回类型和参数类型一一严格对应,否则有可能导致问题,即使参数类型本身是父子关系。
比如如果想自定义一个通知对象来取代通知回调函数中CCObject参数:
真正运行接收通知的时候,诡异问题出现了,发现自动(暗地里)产生了另外一个MyMsgCenter对象, 由于CCObject是以私有继承方式继承,编译器这时候处理的时候认为当前的MyMsgCenter对象也许不是最适合的处理对象,就给你创造了一个临时的对象出来了。
如果改成 class MyMsgCenter : public GameCenter, public CCObject 是没有问题的。另外,不修改public,也可以这样达到正确的目的:
center->addObserver(this, (SEL_CallFuncO)((SEL_NotifyFunc)(&MyMsgCenter::handleLogic)), "xxx", NULL);
经过两次转换之后,不再自动产生MyMsgCenter对象了,也就是你已经显示的告知编译器我这个函数是长什么样了。
比如如果想自定义一个通知对象来取代通知回调函数中CCObject参数:
typedef void (CCObject::*SEL_NotifyFunc)(NotificationObj*); class NotificationObj : public CCObject { public: NotificationObj(void *data) { this->data = data; } void *data; }; class MyMsgCenter : public GameCenter, CCObject { // 一时疏忽,忘记给CCObject加上puclic了 public: MyMsgCenter(); void MyMsgCenter::handleLogic(NotificationObj *obj); // NotificationObj继承CCObject } MyMsgCenter::MyMsgCenter() { NotificationCenter* center = CCNotificationCenter::sharedNotificationCenter(); center->addObserver(this, callfuncO_selector(MyMsgCenter::handleLogic), "xxx", NULL); // 直接强制转换 }
真正运行接收通知的时候,诡异问题出现了,发现自动(暗地里)产生了另外一个MyMsgCenter对象, 由于CCObject是以私有继承方式继承,编译器这时候处理的时候认为当前的MyMsgCenter对象也许不是最适合的处理对象,就给你创造了一个临时的对象出来了。
如果改成 class MyMsgCenter : public GameCenter, public CCObject 是没有问题的。另外,不修改public,也可以这样达到正确的目的:
center->addObserver(this, (SEL_CallFuncO)((SEL_NotifyFunc)(&MyMsgCenter::handleLogic)), "xxx", NULL);
经过两次转换之后,不再自动产生MyMsgCenter对象了,也就是你已经显示的告知编译器我这个函数是长什么样了。
相关文章推荐
- C++在多重继承下的指针类型强制类型转换的一些问题
- 怎样将成员函数指针强制转换成void*指针?
- C函数,函数指针,函数类型,函数数组,函数强制转换使用
- C/C++ 函数指针,强制转换示例
- 多重继承与void*指针转换问题的分析
- 怎样将成员函数指针强制转换成void*指针?
- 指向结构体类型的指针强制转换为指向另外一种结构体类型。会不会出现问题?
- c++ 父类指针转换为子类指针后调用子类的成员函数问题
- 指针强制转换问题
- 函数返回值C语言中malloc函数返回值是否需要类型强制转换问题
- 怎样将成员函数指针强制转换成void*指针?
- 将指针强制类型转换为函数指针
- C++强制转换不同声明或类型的函数指针隐患
- 怎样将 类成员函数指针 强制 转换成 void*指针
- ads中关于函数指针转换的很奇怪的问题
- C++:在多重继承时的指针转换问题
- 怎样将成员函数指针强制转换成void*指针?
- 数组强制转换成结构体指针,结构体内部指针的指向问题
- 关于函数指针类型强制转换的一些摸索
- 0xC000005:Access Violation和指针强制转换问题