模板類中使用友元函式的方式,派生類友元函式對基類的成員使用情況
阿新 • • 發佈:2018-11-11
在一般友元函式的前面加上 template<typename T),注意在函式的宣告和定義處都要加這個模板
例如:
//模板類,長方體類 template <typename ElementType> class Rectangle { ///*過載基類的輸入輸出運算子*/ //template<typename ElementType> //friend std::istream& operator >> (std::istream& in, Rectangle<ElementType>& item);//template<typename ElementType> //friend std::ostream& operator << (std::ostream& out, const Rectangle<ElementType>& item); protected: //受保護的成員 ElementType length; //長方體的長,在類內部可以直接使用模板定義的資料型別 ElementType width; //長方體的寬 RectangleNo myNo; //長方形的序號,巢狀類物件作為Rectangle類的一個數據成員 };
友元函式的定義部分也要加上template<typename T>這個模板
/*過載輸入運算子*/ template <typename ElementType> std::istream& operator >> (std::istream& in, Rectangle<ElementType>& item) { in >> item.length >> item.width >> item.myNo.no;return in; } /*過載輸出運算子*/ template<typename ElementType> std::ostream& operator << (std::ostream& out, const Rectangle<ElementType>& item) { out << "length = " << item.length << " width = " << item.width << " No = " << item.myNo.no; return out; }
如果不知道怎麼宣告模板類的友元函式,可以在類內部用函式實現你想用友元函式實現的功能,
然後在類外的友元函式中呼叫這個類內函式,就可以達到相同的效果
例如:上面那個輸入輸出的友元函式可以改成:
//模板類,長方體類 template <typename ElementType> class Rectangle { public: //讀取長方形 void read(std::istream& in); //輸出長方形 void display(std::ostream& out)const ; protected: //受保護的成員 ElementType length; //長方體的長,在類內部可以直接使用模板定義的資料型別 ElementType width; //長方體的寬 RectangleNo myNo; //長方形的序號,巢狀類物件作為Rectangle類的一個數據成員 };
在類外實現read和display函式後,在類外的友元函式中呼叫這兩個函式即可
template<typename ElementType> void MyRectangle<ElementType>::read(std::istream& in) { cout << "Please enter the length and width of " << myNo.no << endl; in >> length >> width; } template<typename ElementType> void MyRectangle<ElementType>::display(std::ostream& out) const { out << "the " << myNo.no << " Rectangle's length = " << length << " width = " << width; } template<typename ElementType> std::ostream& operator << (std::ostream& out, const Rectangle<ElementType>& item) { item.display(out); return out; } template<typename ElementType> std::istream& operator >> (std::istream& in, Rectangle<ElementType>& item) { item.read(in); return in; }
派生類友元函式對基類的成員使用情況:
派生類友元函式可以使用基類中非private成員,可以使用基類的protected和public成員
基類的成員函式(包括友元函式)只能操作派生類物件中基類那部分。
如果派生類中有函式和基類同名,那麼派生類物件會呼叫派生類中的那個函式,而不是物件的基類部分呼叫基類函式,派生類部分呼叫派生類函式。