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,所以这点须要注意,比較微妙的一个小细节,尽管不是什么问题,但确实须要我们注意。

  

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

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

(0)
上一篇 2021年11月23日 下午5:00
下一篇 2021年11月23日 下午6:00


相关推荐

  • sql server2008安装教程win10_sql数据库2008安装教程

    sql server2008安装教程win10_sql数据库2008安装教程SQLServer2008安装教程第一步,打开文件,点击开始安装;第二步,打开后点击左边项的安装,选择右边第一项;第三步,点击确定;第四步,选择接受服务条款,点击下一步;第五步,按着一般操

    2022年8月5日
    6
  • 理想低通滤波器、Butterworth滤波器和高斯滤波器(matlab)

    理想低通滤波器、Butterworth滤波器和高斯滤波器(matlab)一 简介我们知道 在一幅图像中 其低频成分对应者图像变化缓慢的部分 对应着图像大致的相貌和轮廓 而其高频成分则对应着图像变化剧烈的部分 对应着图像的细节 图像的噪声也属于高频成分 低频滤波器 顾名思义 就是过滤掉或者大幅度衰减图像的高频成分 让图像的低频成分通过 低频滤波器可以平滑图像 虑去图像的噪声 而与此相反的高频滤波器 则是过滤低频成分 通过高频成分 可以达到锐化图像的目的 理想低通滤波器

    2026年3月18日
    2
  • 数据结构之树

    数据结构之树本篇只涉及树的概念范围和应考思路 不涉及具体结构或算法的实现与思考 1 树在计算器科学中 树 英语 tree 是一种抽象数据类型或是实现这种抽象数据类型的数据结构 用来模拟具有树状结构性质的数据集合 它是由 n n gt 0 个有限节点组成一个具有层次关系的集合 把它叫做 树 是因为它看起来像一棵倒挂的树 也就是说它是根朝上 而叶朝下的 它具有以下的特点 每个节点有零个或多个子节

    2026年3月17日
    1
  • C#后台调用前台javascript的五种方法

    C#后台调用前台javascript的五种方法

    2021年8月21日
    65
  • c++字符串转int_python中lower的用法

    c++字符串转int_python中lower的用法在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long和int范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编

    2025年8月24日
    5
  • IntelliJ IDEA 配置svn及使用

    IntelliJ IDEA 配置svn及使用1.安装svn客户端之前用myEcplise只需要插件,现在IDEA需要先下载客户端:TortoiseSVN(小乌龟),下载后安装,然后记住安装路径,我安装的是64位的。TortoiseSVN的下载地址:https://tortoisesvn.net/downloads.html下载完成之后然后开始运行安装svn在勾选之前记得要安装改路径,例:F:\svnClient…

    2022年5月15日
    75

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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