用虚函数作槽函数
当父类的槽函数在两个子类中内容实现不同时,父类的槽函数可以定义为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; }
这一行是签名:生命在于折腾!