為了能夠像cout,cin這樣使用<<,>>流操作符來操作物件,對<<,>>的過載有下面幾個約定:第乙個引數為ostream或istream的引用,第二個引數為類型別,返回與第乙個引數型別相同的引用.所以,可以基本得到過載流操作符的原型:
ostream& operator << (ostream& os, classtype& ct);
istream& operator >> (istream& is, classtype& ct);
現在來說說標題所指,過載流操作符時不能為虛函式.為什麼呢,因為過載流操作符不應該是類的成員函式,而應該把它們宣告為友元,既然不能是成員函式,自然就不能是虛函式.都知道c++的每個類的物件都包含有乙個隱藏的this指標,指向物件本身,假設把過載流操作符的函式宣告為類的成員函式,如下:
class demo
;在呼叫的時候編譯器會把上面的函式理解成
ostream& operator << (this, ostream& os);
istream& operator >> (demo*, istream& is); //與this等同
很明顯這與我們上面所說的約定不同.
現設計兩個類,其中class derived : public base.我們希望能夠像使用簡單資料型別那樣輸出物件,cout << abase << aderived.而上面說了,過載流操作符時不能為虛函式,如果不能是虛成員函式,有沒有辦法實現多型性呢?通過一些小技巧,還是可以實現的,即簡單地讓過載流操作符呼叫該類的另乙個虛函式.下面是簡單的**實現
#include
using namespace std;
class base
public:
base() {}
base(int a) : x(a) {}
virtual void print(ostream& os)
}; // end class base definition
class derived : public base
virtual void print(ostream& os)
}; // end class derived definition
int main()
如何過載流操作符
為自己的類定義插入符和提取符,就是過載相關運算子 第乙個引數定義成流的非const引用 執行插入或提取的操作 返回流的引用 流應該為非常量,因為處理資料將改變流的狀態.通過返回流,可以將多個流操作連線成一條語句.考慮輸出mm dd yyyy格式的date物件 ostream operator ost...
過載函式呼叫操作符
函式呼叫操作符?函式呼叫操作符是 因此此操作符的函式過載是operator 過載函式呼叫操作符的類物件稱為函式物件或仿函式,因此我們可以像使用函式名一樣使用物件名。先看乙個簡單的例子。過載了函式呼叫操作符的乙個類 class area 上面的類中,操作符函式計算乙個面積,它是兩個整數實參的乘積。為了...
C 函式過載操作符
c 可以對操作符 operator 進行過載,一般定義在類的成員函式中,以下面的 為例.class point 定義乙個類模板 建構函式 point 析構函式 過載算術操作符 類似 point operator const point other 過載關係操作符 類似 bool operator c...