1.運算子過載
運算子過載形式:
(1)過載為類的成員函式
運算子過載函式說明為類的成員函式的格式為:
《類名》operator《運算子》(《參數列》)
如:c1+c2
編譯器將給出的解釋為:c1.operator+(c2)
該運算子過載函式僅僅有乙個引數,所以過載為成員函式時,雙目運算子僅有乙個引數。對於單目運算子,過載為成員函式時,再能再顯示說明引數。過載為成員函式時,總是隱含乙個引數,即this指標。
(2)過載為友元函式
運算子過載函式說明為類的友元函式時,有兩個引數,沒有隱含引數。
c1+c2
編譯器將給出的解釋為:operator+(c1, c2)
(3)兩種過載方式的比較
一般來說,單目運算子最好被過載為成員函式,雙目運算子最好能被過載為友元函式。
在有些情況下,不便於過載為成員函式。
如:c+1.1,這裡c是complex類的物件。
過載被表達為:c.operator+(1.1),可以呼叫
complex::operator+(double d),如果沒有該成員函式,可以呼叫如下的過載函式:
complex::operator+(const complex &c),所以最總表達為
c.opeartor(complex(1.1))
如果是友元函式,則表達為
operator+(c, complex(1.1))
但是如果表示式為1.1+c
友元函式表達為:operator+(complex(1.1), c)
成員函式表達為:1.1.operator+(c)顯然是不合適的
//????為什麼不能解釋為complex(1.1).operator+(c),待驗證
雙目運算子賦值過載為成員函式比較合適。
虛函式virtual《型別說明符》《函式名》 (《參數列》)
如果某類中的乙個成員函式被說明為虛函式,這就意味著該成員函式在派生類中可能有不同的實現方式。當使用這個成員函式操作指標或引用所標識物件時,對該成員函式呼叫採取動態編聯方式,即在執行時進行關聯或束定。
派生類中對基類的虛函式進行替換時,要求派生類中說明的虛函式與基類的被替換的虛函式滿足如下條件:
(1)與基類的虛函式有相同的引數個數
(2)其引數的型別與基類的虛函式的對應引數型別相同
(3)其返回值或者與基類的虛函式相同,或者都返回指標和引用,並且派生類虛函式所返回的指標或者引用是基類中被替換的虛函式所返回的指標或引用的基型別的子型別。
純虛函式
virtual《型別說明符》《函式名》(《參數列》)=0
純虛函式是在基類中不能給出有意義的實現,完全交給派生類做,帶有純虛函式的類為抽象類。
//第一階段簡要結束
C 多型性與虛函式
物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...
C 多型性與虛函式
多型性是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。在c 中有兩種多型性 1 定義格式 虛函式是乙個類的成員函式,定義格式如下 virtual 返回型別 函式名 參數列 說明 2 通過虛函式實現多型性...
C 多型性與虛函式
2 多型是物件導向的重要技術之一,它是一種行為的封裝,是同乙個事物所表現出來的多種形態,簡單地說就是 乙個介面 多種形態。3 在執行時使用同乙個成員名來呼叫類物件的成員函式,會呼叫哪個物件的成員函式呢?這就是多型要解決的問題!1 多型技術允許將基類指標或基類引用指向派生類物件。2 把不同派生類的物件...