更多 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
{ ... }
};
- 虚拟友元函数习语,马歇尔·克莱恩