1. 程式人生 > >模板類中使用友元函式的方式,派生類友元函式對基類的成員使用情況

模板類中使用友元函式的方式,派生類友元函式對基類的成員使用情況

在一般友元函式的前面加上 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成員

基類的成員函式(包括友元函式)只能操作派生類物件中基類那部分。

如果派生類中有函式和基類同名,那麼派生類物件會呼叫派生類中的那個函式,而不是物件的基類部分呼叫基類函式,派生類部分呼叫派生類函式。