一、概念
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括桃山網(wǎng)站建設(shè)、桃山網(wǎng)站制作、桃山網(wǎng)頁(yè)制作以及桃山網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,桃山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到桃山省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)的三大特征之一。封裝性是基礎(chǔ),繼承性是關(guān)鍵,多態(tài)性是補(bǔ)充,而多態(tài)又存在于繼承的環(huán)境之中。多態(tài)性的含義就是多種狀態(tài)。C++語(yǔ)言中支持兩種多態(tài)性。一種是函數(shù)重載和運(yùn)算符重載,又被稱為靜態(tài)多態(tài),另一種是動(dòng)態(tài)聯(lián)編和虛函數(shù),被稱為動(dòng)態(tài)多態(tài)。在這里主要討論第一種和第二種的虛函數(shù)。
1.函數(shù)重載
函數(shù)重載簡(jiǎn)單的說(shuō)就是給一個(gè)函數(shù)名多個(gè)含義。C++語(yǔ)言中允許在相同的作用域內(nèi)以相同的名字定義幾個(gè)不同實(shí)現(xiàn)的函數(shù)。定義這種重載函數(shù)時(shí)要求函數(shù)的參數(shù)或者至少有一個(gè)類型不同,或者個(gè)數(shù)不同,或者順序不同。參數(shù)個(gè)數(shù)和類型,順序都相同,僅返回值不同的重載函數(shù)是非法的。因?yàn)榫幾g程序在選擇相同名字的重載函數(shù)是僅考慮函數(shù)參數(shù)列表,即要根據(jù)函數(shù)參數(shù)列表中的參數(shù)個(gè)數(shù)、參數(shù)類型或參數(shù)順序的差異進(jìn)行選擇。
舉例:string類的構(gòu)造函數(shù)重載(編譯環(huán)境:VS2013)
#define _CRT_SECURE_NO_WARNINGS 1 #includeusing namespace std; #include class String { public: String(char *s) { length = strlen(s); ps = new char[length + 1]; strcpy(ps, s); } String(string &s) { length = s.length; ps = new char[length + 1]; strcpy(ps, s.ps); } String(int size = 20) { length = size; ps = new char[length + 1]; *ps = '\0'; } ~String() { delete ps; } int getlen() { return length; } void print() { cout << ps << endl; } private: char* ps; int length; }; int main() { String str1("String"); str1.print(); cout << str1.getlen() << endl; char *ps1 = "String Pionter"; String str2(ps1); String str3(str2); str3.print(); cout << str3.getlen() << endl; system("pause"); return 0; }
String類的構(gòu)造函數(shù)被重載了三次,
str1("String")調(diào)用構(gòu)造函數(shù)String(char *s);
str2(ps1)調(diào)用構(gòu)造函數(shù)String(char *s);
str3(str2)調(diào)用構(gòu)造函數(shù)String(String);
2.運(yùn)算符重載
運(yùn)算符重載重載就是賦予已有的運(yùn)算符多重定義,使它具多種多種功能。
定義方法:類名 operator運(yùn)算符(參數(shù)列表){ }
下面的運(yùn)算符在C++中允許重載:
算數(shù)運(yùn)算符: +, -, *, /, %, ++, --
位操作運(yùn)算符: &,|, ~, ^, <<,>>
邏輯運(yùn)算符: !, &&, ||
比較運(yùn)算符: <, >, <=, >=, ==, !=
賦值運(yùn)算符: =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
其它運(yùn)算符: [], (), ->, ', new, delete, new[], delete[]
下列運(yùn)算符不允許重載:
·,·*, ::,?
使用運(yùn)算符重載的注意:
用戶重新定義運(yùn)算符時(shí),不改變?cè)\(yùn)算符的優(yōu)先級(jí)和結(jié)合性。不改變運(yùn)算符的操作數(shù)個(gè)數(shù)和語(yǔ)法結(jié)構(gòu),單目運(yùn)算符只能重載為單目運(yùn)算符,雙目運(yùn)算符只能重載雙目運(yùn)算符。
重載運(yùn)算符不能有二義性。
運(yùn)算符重載舉例:
//運(yùn)算符重載 #includeusing namespace std; class Complex { //friend Complex operator+(Complex c1, Complex c2); public: Complex(double real = 0.0, double p_w_picpath = 0.0) : _real(real) , _p_w_picpath(p_w_picpath) {} Complex(const Complex& c) : _real(c._real) , _p_w_picpath(c._p_w_picpath) {} Complex operator+(const Complex& c1) { return Complex(_real + c1._real, _p_w_picpath + c1._p_w_picpath); } Complex operator-(const Complex& c1) { return Complex(_real - c1._real, _p_w_picpath - c1._p_w_picpath); } Complex operator*(const Complex& c1) { return Complex(_real*c1._real - _p_w_picpath*c1._p_w_picpath, _real*c1._p_w_picpath + _p_w_picpath*c1._real); } Complex operator/(const Complex& c1) { return Complex((_real*c1._real + _p_w_picpath*c1._p_w_picpath) / (c1._p_w_picpath*c1._p_w_picpath + c1._real*c1._real), (_p_w_picpath*c1._real - _real*c1._p_w_picpath) / (c1._p_w_picpath*c1._p_w_picpath + c1._real*c1._real)); } Complex& operator+=(const Complex& c1) { _real = _real + c1._real; _p_w_picpath = _p_w_picpath + c1._p_w_picpath; return *this; } Complex& operator-=(const Complex& c1) { _real = _real - c1._real; _p_w_picpath = _p_w_picpath - c1._p_w_picpath; return *this; } Complex& operator*=(const Complex& c1) { double tmp = _real; _real = _real*c1._real - _p_w_picpath*c1._p_w_picpath; _p_w_picpath = tmp*c1._p_w_picpath + _p_w_picpath*c1._real; return *this; } Complex& operator/=(const Complex& c1) { double tmp = _real; _real = (_real*c1._real + _p_w_picpath*c1._p_w_picpath) / (c1._p_w_picpath*c1._p_w_picpath + c1._real*c1._real); _p_w_picpath = (_p_w_picpath*c1._real - tmp*c1._p_w_picpath) / (c1._p_w_picpath*c1._p_w_picpath + c1._real*c1._real); return *this; } // 只比較實(shí)部 bool operator<(const Complex& c) { if (_real (const Complex& c) { if (_real>c._real) { return true; } else { return false; } } bool operator<=(const Complex& c) { if ((_real 對(duì)復(fù)數(shù)的四則運(yùn)算,++,--(前置,后置)等進(jìn)行了重載。
3.虛函數(shù)
使用virtual關(guān)鍵字修飾函數(shù)時(shí),指明該函數(shù)為虛函數(shù),派生類需要重新實(shí)現(xiàn),編譯器將實(shí)現(xiàn)動(dòng)態(tài)綁定。
總結(jié):
1、派生類重寫基類的虛函數(shù)實(shí)現(xiàn)多態(tài),要求函數(shù)名、參數(shù)列表、返回值完全相同。(協(xié)變除外)
2、基類中定義了虛函數(shù),在派生類中該函數(shù)始終保持虛函數(shù)的特性。
3、只有類的成員函數(shù)才能定義為虛函數(shù),靜態(tài)成員函數(shù)不能定義為虛函數(shù)。
4、如果在類外定義虛函數(shù),只能在聲明函數(shù)時(shí)加virtual關(guān)鍵字,定義時(shí)不用加。
5、構(gòu)造函數(shù)不能定義為虛函數(shù),雖然可以將operator=定義為虛函數(shù),但最好不要這么做,使用時(shí)容易混淆
6、不要在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù),在構(gòu)造函數(shù)和析構(gòu)函數(shù)中,對(duì)象是不完整的,可能會(huì)出現(xiàn)未定義的行為。
7、最好將基類的析構(gòu)函數(shù)聲明為虛函數(shù)。(析構(gòu)函數(shù)比較特殊,因?yàn)榕缮惖奈鰳?gòu)函數(shù)跟基類的析構(gòu)函數(shù)名稱不一樣,但是構(gòu)成覆蓋,這里編譯器做了特殊處理)
8、虛表是所有類對(duì)象實(shí)例共用的。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)名稱:學(xué)習(xí)C++中的多態(tài)-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://weahome.cn/article/dciojd.html