在子類裏使用 using 父類::父類函數名fun

簡介: 在子類裏使用 using 父類:: 父類函數名fun; 這算是一個**c++**的知識點吧,自己在一個項目中看到卻不理解的地方, 自己的搜索關鍵詞爲:派生類使用 using 父類 :: 函數名;所以這一篇的名稱就取名爲這個

同步博文:


派生類裏使用using原因:

如果基類中成員函數有多個重載版本,派生類可以重定義所繼承的 0 個或多個版本,但是 通過派生類型只能訪問派生類中重定義的那些版本,所以如果派生類想通過自身類型使用所有的重載版本,則派生類必須要麼重定義所有重載版本要麼一個也不重定義。有時類需要僅僅重定義一個重載集中某些版本的行爲,並且想要繼承其他版本的含義,在這種情況下,爲了重定義需要特化的某個版本而不得不重定義每一個基類版本,可能會令人厭煩。可以在派生類中爲重載成員名稱提供 using 聲明(爲基類成員函數名稱而作的 using 聲明將該函數的所有重載實例加到派生類的作用域),使派生類不用重定義所繼承的每一個基類版本。一個 using 聲明只能指定一個名字,不能指定形參表,使用using聲明將名字加入作用域之後,派生類只需要重定義本類型確實必須定義的那些函數,對其他版本可以使用繼承的定義。

“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:

1、如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。

2、如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)


class My
{
public:
    My();

    void fun();
    void fun(int n);
    void fun(QString str);
    void fun(int n, QString str);

    virtual void fun02();
    virtual void fun02(int n);
    virtual void fun02(QString str);
    virtual void fun02(int n, QString str);
};

class MySon : public My
{
public:
    MySon();
    void fun(int n);

    virtual void fun02(int n) override;

    using My::fun;    //本篇所講
    using My::fun02;  //本篇所講
};

int main(int argc, char *argv[])
{
    MySon mySon;
    mySon.fun(1);        //只一個"智能提示":是int類型

    mySon.fun();         //此(含自己)後面三個都是得益於 using My::fun; 而可以使用
    mySon.fun("str");    //仍然手寫調用My::fun(QString)其他類型, 可以被調用
    mySon.fun(2, "ac");

    qDebug("");

    mySon.fun02(4);      //重寫的那個函數,也是唯一的一個的"智能提示"的 int類型
    mySon.fun02();       //此(含自己)後面三個都是得益於 using My::fun02; 而可以使用
    mySon.fun02("ab");
    mySon.fun02(3, "test");
}

調用同名函數fun 或者 fun02 就只有通過一個My::來調用


運行效果:

補充一點: 使用using My::fun; //本篇所講using My::fun02; //本篇所講,在派生類MySon若是想調用同名函數fun 或者 fun02 就只有通過一個My::來調用


源碼下載:

測試源碼:test c++ 使用 using 測試


參考文章:

C++ using關鍵字作用 (重載父類函數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章