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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTML5快速设计网页[通俗易懂]

    HTML5快速设计网页目录一、认识web开发和软件安装二、使用HTML/HTML5搭建页面骨架一、认识web开发和软件安装1、认识网页:商城网页比较经典,比如京东,淘宝、小米商城还有锤子官网等有图片、文字还有一些多媒体组合而成的。我们还需要善于观察然后模仿成自己的2、网站:由多个网页组织在一起而成的,网页和网页之间是有联系的。就像蜘蛛网一样织成一张大网3、用户眼中…

    2022年4月11日
    51
  • 跟我学Telerik公司的RadControls控件(二)

    跟我学Telerik公司的RadControls控件(二)  继上篇我们学习了RadWindow控件的用法之后,本篇我们将学习在项目中更加方便开发人员的常用控件RadAjax控件.  RadAjax是面向ASP.NET应用程序无编码AJAX使能化的第一个框架。这个专利Click-and-Go™技术可以让你不需要对你应用程序做任何修改(摆放Callback面板,设置触发器等)。最棒的是,你根本不需要写一行的JavaScript或s…

    2022年7月19日
    21
  • 学习vb语言「建议收藏」

    学习vb语言「建议收藏」第一天:昨天完成了安装vb环境今天大概了解了一下vb语言的一些语法,但是把所学的整理出来,一时间却又不知道如何整理。换一个方式,我来看看接下来要学什么。1.vb变量的作用域2.常用的内部函数3.数据的输入和输出4.常用的标准控件5.vb结构控制6.键盘过程7.菜单和对话栏8.数据文件学习这些的基础是今天所学的或者所了解到的1.建立一个vb程序的大致流…

    2022年6月21日
    27
  • SpringBoot面试题整理,常问SpringBoot面试题汇总(2020版)

    SpringBoot面试题整理,常问SpringBoot面试题汇总(2020版)找工作的历程太艰难,面试的过程很心烦,在没着落的每一天,心情都不太美妙,这时的我们唯一能做的就是多总结,多做准备,这样,起码心里会好受些!所以我准备了一点SpringBoot的面试题,为还正在找工作的小伙伴多增加些成功的筹码!1、什么是SpringBoot?SpringBoot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。2、SpringBoot有哪些优点?.

    2022年5月21日
    38
  • iOS8下的UIAlertContoller初探

    iOS8下的UIAlertContoller初探

    2021年8月29日
    63
  • java的大数运算(高新技术产品有哪些)

    java的大数运算(高新技术产品有哪些)本篇博客主要介绍Java常用类库之大数操作,主要是BigInteger和BigDecimal的API学习。之后介绍华为的一道历年真题,十六进制转换成十进制,我们可以看到题目中给我们设置的陷阱,以及如何解决它!

    2022年4月18日
    56

发表回复

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

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