国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C++多態(tài)性(靜多態(tài)和動(dòng)多態(tài))

C++多態(tài)性(靜多態(tài)和動(dòng)多態(tài))

C++多態(tài)性

C++中的多態(tài)(雖然多態(tài)不是C++所特有的,但是C++中的多態(tài)確實(shí)是很特殊的)分為靜多態(tài)和動(dòng)多態(tài)(也就是靜態(tài)綁定和動(dòng)態(tài)綁定兩種現(xiàn)象),靜動(dòng)的區(qū)別主要在于這種綁定發(fā)生在編譯期還是運(yùn)行期,發(fā)生在編譯期的是靜態(tài)綁定,也就是靜多態(tài);發(fā)生在運(yùn)行期的則是動(dòng)態(tài)綁定,也就是動(dòng)多態(tài)。
靜多態(tài)可以通過(guò)模板和函數(shù)重載來(lái)實(shí)現(xiàn)(之所說(shuō)C++中的多態(tài)主要還是因?yàn)槟0暹@個(gè)東西),下面舉兩個(gè)例子:
1)函數(shù)模板
template <typename T>
T max(const T& lsh, const T& rhs) 
{
       return (lsh > rhs) ? lsh : rhs;
}
返回兩個(gè)任意類(lèi)型對(duì)象的最大值(對(duì)象),前提是該類(lèi)型能夠使用>運(yùn)算符進(jìn)行比較,并且返回值是bool類(lèi)型。
使用:
int a = 3; int b = 4;
cout << max(a, b) << endl;
float c = 2.4; float d = 1.2;
cout << max(c, d) << endl;
輸出結(jié)果為:
         4
                2.4
這種綁定發(fā)生在編譯期,這是由于模板的實(shí)例化是發(fā)生在編譯期的,即在編譯時(shí)編譯器發(fā)現(xiàn)你調(diào)用max(a, b)時(shí)就自動(dòng)生成一個(gè)函數(shù)
int max(const int& lsh, const int& rhs) 
{
       return (lsh > rhs) ? lsh : rhs;
}
即將所有的T替換成int;
當(dāng)你調(diào)用max(c, d)時(shí)就自動(dòng)生成一個(gè)函數(shù)
float max(const float& lsh, const float& rhs)
{
        return (lsh > rhs) ? lsh : rhs;
}
之所以說(shuō)開(kāi)始的函數(shù)定義是函數(shù)模板,就是因?yàn)樗拖駛€(gè)模子似的,你可以用鋁作為原料也可以用石膏或者銅。
2)函數(shù)重載:函數(shù)名相同,參數(shù)類(lèi)型或個(gè)數(shù)不完全相同,返回值一樣。
    函數(shù)重載不同于函數(shù)覆蓋:函數(shù)覆蓋指派生類(lèi)重新定義基類(lèi)某虛函數(shù),參數(shù)和返回類(lèi)型完全一樣。
int max (int a, int b)
{
     return (a > b) ? a : b;
}
int max (int a, int b, int c)
{
     return max(max(a, b), c);
}
兩個(gè)函數(shù)名稱(chēng)一樣,參數(shù)類(lèi)型或個(gè)數(shù)不完全相同,返回值一樣(這個(gè)不重要)。
使用:
int a = 3, b = 4, c = 5;
cout << max(a, b) << endl;
cout << max(a, b, c) << endl;
輸出結(jié)果為:
         4
                5
確定函數(shù)的過(guò)程也發(fā)生在編譯器,當(dāng)你使用max(a, b),編譯器發(fā)現(xiàn)只有兩個(gè)參數(shù),那么就調(diào)用只有兩個(gè)參數(shù)的函數(shù)版本,當(dāng)使用max(a, b, c)時(shí),編譯器則使用有3個(gè)參數(shù)的版本。
通過(guò)上面的兩個(gè)例子,你還可以使用更為方便的模板函數(shù)重載:
template <typename T>
T max(const T& lsh, const T& rhs) 
{
       return (lsh > rhs) ? lsh : rhs;
}
 
template <typename T>
T max(const T& a, const T& b, const T& c)
{
      return max(max(a, b), c);
}
使用
float a = 3.6, b = 1.2, c = 7.8;
cout << max(a, b, c) << endl;
輸出:
       7.8
通過(guò)參數(shù)個(gè)數(shù)和類(lèi)型,編譯器自動(dòng)生成和調(diào)用對(duì)應(yīng)得函數(shù)版本!
 
動(dòng)多態(tài)則是通過(guò)繼承、虛函數(shù)(virtual)、指針來(lái)實(shí)現(xiàn)。(三者結(jié)合起來(lái)實(shí)現(xiàn))
函數(shù)覆蓋:指派生類(lèi)重新定義基類(lèi)某虛函數(shù),參數(shù)和返回類(lèi)型完全一樣。
class A {
public:
    virtual void func() const {
         coust << “A::func()” << endl;
    }
}
 
class B : public A {
public: 
    virtual void func() const {
         coust << “B::func()” << endl;
    }
}
使用:
A a* = B();
a->func();
輸出:
     B::func()
編譯期是不調(diào)用任何函數(shù)的,編譯器編譯到a->func()時(shí)只是檢查有沒(méi)有語(yǔ)法問(wèn)題,經(jīng)過(guò)檢查沒(méi)有。編譯器并不知道調(diào)用的是A版本的func()還是B版本的func(),由于a是一個(gè)指向B對(duì)象的指針,所以a只知道它指向的是一個(gè)A類(lèi)型(或者能轉(zhuǎn)換成A類(lèi)型)的對(duì)象。通常集成體系就說(shuō)明了(由于是公有繼承)B是一種A。在運(yùn)行期,a要調(diào)用a所指向?qū)ο蟮膄unc()函數(shù),就對(duì)它指向的對(duì)象下達(dá)調(diào)用func()的命令,結(jié)果a所指向的是一個(gè)B對(duì)象,這個(gè)對(duì)象就調(diào)用了自己版本(B版)的func()函數(shù),所以輸出時(shí)B::func()
 
總結(jié):
在編譯期決定你應(yīng)該調(diào)用哪個(gè)函數(shù)的行為是靜態(tài)綁定(static-binding),這種現(xiàn)象就是靜多態(tài)。
在運(yùn)行期決定應(yīng)該調(diào)用哪中類(lèi)型對(duì)象的函數(shù)的行為是動(dòng)態(tài)綁定(dynamic-binding),這種現(xiàn)象就是動(dòng)多態(tài)!
 
注:由于這是我花了有限的時(shí)間總結(jié)的,語(yǔ)言應(yīng)用能力比較差,還有比如類(lèi)模板(靜多態(tài)和動(dòng)多態(tài)組合的情況)都沒(méi)有說(shuō),最近比較忙,請(qǐng)見(jiàn)諒!
 
如果還不是很懂,我建議你看C++Primer 4th Edition,講的比較清晰,但是比較零散!

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
c++的拷貝構(gòu)造函數(shù)中直接使用私有變量
04選擇題: C++ 對(duì)象 執(zhí)行順序
淺談C++模板機(jī)制
__FUNCTION__ 在C語(yǔ)言中的應(yīng)用__伯灬爵__新浪博客
5分鐘搞懂C 函數(shù)指針與函數(shù)類(lèi)型
C++:C++11新特性詳解(1)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服