簡介: 在子類裏使用 using
父類:: 父類函數名fun
; 這算是一個**c++**的知識點吧,自己在一個項目中看到卻不理解的地方, 自己的搜索關鍵詞爲:派生類 中 使用 using 父類 :: 函數名
;所以這一篇的名稱就取名爲這個
同步博文:
- 本篇的csdn/github.io同步博文: 在子類裏使用 using 父類::父類函數名fun
派生類裏使用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 測試
參考文章: