更多 C++ 習語/虛擬友元函式
外觀
模擬虛擬友元函式。
友元函式在 C++ 中經常需要。一個典型的例子是那些可以列印到輸出流的型別(例如,std::cout)。為了實現無縫的流式傳輸功能,需要一個過載的左移運算子函式,它通常是友元函式。友元函式實際上是類的介面的擴充套件。但是,C++ 中的友元函式不能宣告為虛擬的,因此無法實現友元函式的動態繫結。如果層次結構中的每個類都需要一個過載的友元函式,那麼將友元函式應用於整個類層次結構就會變得很麻煩。這種對動態繫結的缺乏支援使得很難證明友元函式實際上是類的介面的擴充套件。虛擬友元函式習語優雅地解決了這個問題。
虛擬友元函式習語利用額外的間接定址來實現友元函式的動態繫結的預期效果。在這種習語中,通常只有一個函式是層次結構中基類的友元函式,並且友元函式只是將工作委託給一個虛擬的輔助成員函式。輔助函式在每個派生類中都被重寫,並且真正執行工作,友元函式僅僅充當一個門面。
class Base {
public:
friend ostream& operator << (ostream& o, const Base& b);
// ...
protected:
virtual void print(ostream& o) const
{ ... }
};
/* make sure to put this function into the header file */
inline std::ostream& operator<< (std::ostream& o, const Base& b)
{
b.print(o); // delegate the work to a polymorphic member function.
return o;
}
class Derived : public Base {
protected:
virtual void print(ostream& o) const
{ ... }
};
- 虛擬友元函式習語,馬歇爾·克萊恩