過載流操作符時不能為虛函式

2021-05-22 02:44:19 字數 1109 閱讀 6971

為了能夠像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...