C++在使用Qt中SLOT宏须要注意的一个小细节

C++在使用Qt中SLOT宏须要注意的一个小细节

大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类假设覆写,在基类指针或者引用来指向子类的时候会实现动态绑定。

    但假设指针去调用非虚函数,这个时候会调用C++的静态绑定,去推断当前的指针是什么类型,就去运行哪个类型的函数。

    非常有一种比較经典的使用方法,就是Template Method模式,基类定义一个非虚的算法框架,里面详细定义一些纯虚的函数片段,由子类来进行实现,从而实现了控制整体框架,但能够给客户自由定制的灵活性。这个使用方法事实上就是指针去调用了基类的方法,由方法的扩展之后扩展到虚函数的地方,指针继续使用了动态绑定特性进行查找虚函数表,通过理解为函数扩展,这样的理解似乎能够简单的多。

    但在使用Qt的SLOT的时候,会出现一个问题须要注意,就是在connect的时候,你给当前的子类对象child设置了SLOT宏,但这个宏也在基类中实现过,举个样例

Class Base : public QObject
{
Q_OBJECT
public:
   Base();
   void myConnect(QObject *other) { connect(other, SIGNAL(test()), this, SLOT(say())) }
privare slots:
   void say(){ qDebug() << "Base" };  
};

Class Child: public Base
{
Q_OBJECT
public:
   Child();
privare slots:
   void say(){ qDebug() << "Child" };  
};

在Base的myConnect中,this指针表示你在当前Base类中,这个时候非常自然的去调用Base::say(),一開始可能这样写为了自己主动连接和断除比較方便,可是假设你写了继承子类,你非常自然的去覆写了say这个函数,而且认为既然不是虚函数,没什么须要操心的,你可能会去用Child去连接别的对象,心理还在想着Base中say的实现方法(由于我记得我当初链接信号的时候写是在Base中写的,而且我如今没实用指针和引用,Child的say方法应该非常安全),但你会发现,最后触发的确实自己的slot,所以这点须要注意,比較微妙的一个小细节,尽管不是什么问题,但确实须要我们注意。

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119038.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vim退出编辑模式非esc_centos保存退出vim

    vim退出编辑模式非esc_centos保存退出vimlinux中退出vi编辑器,按下esc没反应的解决办法:1、在正常模式下按下q键盘;2、选择【a-z】或【0-9】中任意一个作为缓冲器的名字,准备开始录制宏;3、在非insert模式下输入q停止宏的录制;4、使用@和定义的缓冲器名字即可。linux中退出vi编辑器,按下esc没反应的解决办法:vimrecording功能介绍使用vim时无意间触碰到q键,左下角出现“recording”这个标识,…

  • 工厂+策略解决多重if-else

    工厂+策略解决多重if-else

  • pycharm运用_python界面开发

    pycharm运用_python界面开发PyCharm是由JetBrains团队研发的用于开发python应用程序的IDE,与IDEA一脉相承首先打开PyCharm的下载地址 https://www.jetbrains.com/pycharm/download/  点击download下载专业版:这时会跳到一个感谢界面,不必理睬,耐心等待下载完成就可以了:下载完的安装程序是这样的:双击安装,点击

  • 海量图片存储解决方案

    海量图片存储解决方案当今世界,互联网、大数据应用迅猛发展,物联网、人工智能、云计算技术日新月异,随之而来的是各种企业和个人应用持续不断地产生亿级甚至是百亿级的海量小文件。这些小文件的元数据管理、存储性能以及访问效率等问题因而成为学术界和工业界公认的难题。例如,国内目前最大的电商网站淘宝存储的商品图片超过200亿张,这些文件的平均大小仅为15KB左右,国外著名的社交网站Facebook存储的图片总量更是超…

  • mjrefresh原理_mjp是什么意思

    mjrefresh原理_mjp是什么意思1.  UIView+MJExtension 可以用来获取、设置x/y/w/h等

    2022年10月25日
  • python判断是否为数字类型_python判断字符串是否为数字

    python判断是否为数字类型_python判断字符串是否为数字以下实例通过创建自定义函数is_number()方法来判断字符串是否为数字:#-*-coding:UTF-8-*-#Filename:test.py#authorby:www.runoob.comdefis_number(s):try:float(s)returnTrueexceptValueError:passtry:importunicodedataunico…

    2022年10月25日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号