欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

将虚拟函数用作插槽函数

最编程 2024-04-14 10:42:53
...
武汉源创会回归,4月20聊聊大模型”

当父类的槽函数在两个子类中内容实现不同时,父类的槽函数可以定义为virtual函数,并在子类中分别实现。根据多态性,子类的槽函数会被连接。注意父类中也要有此槽函数的实现(或者=0;),否则编译链接不能通过。

一说多态,网上总是用 Child ch; Base *pBs=&ch; pBs->print(); 来举例,让人很不解,为什么要用基类指针指向子类实例?有什么用?只为了实现多态而多态吗?

那么下面这个例子就清楚一些了,多态/虚函数是为了基类中预订一个行为 并让子类来实现。

#include <stdio.h>
class Base
{
public:
Base()
{
print();//调用基类的print
}
void Test() { Base::print();//调用基类的print print();//调用子类的print } virtual void print() { printf("Base\n"); } }; class Child: public Base { public: virtual void print() { printf("Child\n"); } }; int main() { Child ch; ch.Test(); return 0; }

 要注意的是,基类构造函数中调用虚函数,是调用的基类的虚函数,而不是子类的。因为Child实例创建时,先调用Base的构造函数,此时Child还没构造,其print函数还不存在,只能调用Base的print。

但在Qt中,基类构造函数中connect虚槽函数,却能够链接到子类的槽函数,可能这就是所谓运行时多态吧。

class Base : public QObject
{
    Q_OBJECT
public:
    Base()
    {
        connect(this, &Base::signal, this, &Base::print);//链接子类的print
    }
public slots:
    virtual void print()
    {
        printf("Base\n");
    }
signals:
    void signal();
};
class Child: public Base
{
public:
    void Test()
    {
        emit signal();
    }
public slots:
    virtual void print()
    {
        printf("Child\n");
    }
};
int main()
{
    Child ch;
    ch.Test();
    return 0;
}

 

推荐阅读