當父類的槽函數在兩個子類中內容實現不同時,父類的槽函數可以定義為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; }