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

       

  • 相关阅读:
    机房收费系统——报表(2)
    机房收费系统——报表(1)
    机房收费系统之结账
    机房管理系统——vb与excel链接2
    机房管理系统——VB与Excel的链接
    Unity
    Android Dev Tips
    Android JSON And Object Cast
    Android Screen Orientation
    iOS8 with Swift
  • 原文地址:https://www.cnblogs.com/rickyk/p/3792149.html
Copyright © 2020-2023  润新知