为了做到这一点,您需要寻求某种双重调度解决方案的访客。双分派方法更轻量级,所以这样的事情怎么样:
在一个:
class Processor
{
public:
virtual void Process(const A &a)const {}
virtual void Process(const B &b)const {}
virtual void Process(const C &c)const {}
virtual void Process(const D &d)const {}
virtual void Process(const E &e)const {}
};
在一个:
class A
{
public:
virtual void Process(const Processor &processor)
{
processor.Process(*this);
}
};
然后,在每个派生类Process
中使用相同的定义覆盖:
virtual void Process(const Processor &processor)
{
processor.Process(*this);
}
这将确保Process
调用正确的重载。
现在,创建一个流处理器:
class StreamProcessor : public Processor
{
private:
OutputStream &m_OS;
public:
StreamProcessor(OutputStream &os) : m_OS(os)
{
}
virtual void Processor(const A &a)const
{
m_os << "got a A";
}
virtual void Processor(const B &b)const
{
m_os << "got a B";
}
virtual void Processor(const C &c)const
{
m_os << "got a C";
}
// etc
};
接着:
OutputStream &operator<<(OutputStream &os, A &a)
{
PrintProcessor(os);
a.Process(PrintProcessor);
return os;
}