用虛函數作槽函數


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM