C++在使用Qt中SLOT宏需要注意的一个小细节
来源:互联网 发布:linux syslog存放位置 编辑:程序博客网 时间:2024/06/04 18:04
大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类如果覆写,在基类指针或者引用来指向子类的时候会实现动态绑定。
但如果指针去调用非虚函数,这个时候会调用C++的静态绑定,去判断当前的指针是什么类型,就去执行哪个类型的函数。
很有一种比较经典的用法,就是Template Method模式,基类定义一个非虚的算法框架,里面具体定义一些纯虚的函数片段,由子类来进行实现,从而实现了控制总体框架,但可以给客户自由定制的灵活性。这个用法其实就是指针去调用了基类的方法,由方法的扩展之后扩展到虚函数的地方,指针继续使用了动态绑定特性进行查找虚函数表,通过理解为函数扩展,这种理解似乎可以简单的多。
但在使用Qt的SLOT的时候,会出现一个问题需要注意,就是在connect的时候,你给当前的子类对象child设置了SLOT宏,但这个宏也在基类中实现过,举个例子
Class Base : public QObject{Q_OBJECTpublic: Base(); void myConnect(QObject *other) { connect(other, SIGNAL(test()), this, SLOT(say())) }privare slots: void say(){ qDebug() << "Base" }; };Class Child: public Base{Q_OBJECTpublic: Child();privare slots: void say(){ qDebug() << "Child" }; };
在Base的myConnect中,this指针表示你在当前Base类中,这个时候很自然的去调用Base::say(),一开始可能这样写为了自动连接和断除比较方便,但是如果你写了继承子类,你很自然的去覆写了say这个函数,并且觉得既然不是虚函数,没什么需要担心的,你可能会去用Child去连接别的对象,心理还在想着Base中say的实现方法(因为我记得我当初链接信号的时候写是在Base中写的,并且我现在没有用指针和引用,Child的say方法应该很安全),但你会发现,最后触发的确实自己的slot,所以这点需要注意,比较微妙的一个小细节,虽然不是什么问题,但确实需要我们注意。
0 0
- C++在使用Qt中SLOT宏需要注意的一个小细节
- 界面设计中需要注意的小细节
- iOS中需要注意的小细节
- 使用OpenCV需要注意的小细节
- 使用OpenCV需要注意的小细节
- Object-C中需要注意的细节
- 在SSH2开发中需要注意的一个小问题。
- arguments 向array转化中 需要注意的一个小细节
- C需要注意的细节
- iOS开发中需要注意的一些小细节
- 初学者-html中button标签需要注意的小细节
- 在MyEclipse中使用Hibernate需要注意的一个问题
- 使用SQL之UNION时需要注意的一个细节
- 使用LINQ分页时需要注意的一个细节
- 黑马程序员——OC基础--@property在开发中需要注意的使用细节
- 安卓需要注意的小细节
- mybatis需要注意的小细节
- 使用TRY CATCH应该注意的一个小细节
- Java动态代理Proxy学习
- ntp时间同步,各种配置方法
- 3DES
- linux的虚拟内存优化
- Linux线程-互斥锁pthread_mutex_t
- C++在使用Qt中SLOT宏需要注意的一个小细节
- 每日笔记——网络调试
- textarea 在浏览器中固定大小和禁止拖动
- wkhtmltopdf 中文不能显示问题完美解决
- PAM (Pluggable Authentication Modules, 嵌入式模块) 机制简介
- Android基于XMPP Smack Openfire下学习开发IM(三)会议室创建、加入以及查询会议室中所有成员等
- linux调度机制
- 电子商务实训2
- http协议缓存相关