我正在实现C++ FAQ中描述的类层次结构的打印模式。在FAQ中,打印函数在基类中声明如下:
protected:
virtual void printOn(std::ostream& o) const = 0; // pure virtual
// -- or --
virtual void printOn(std::ostream& o) const; // plain virtual
我正在考虑实现该printOn
方法的普通虚拟版本,但有一些变化。我想将返回类型从void
更改std::ostream&
为如下所示:
protected:
virtual std::ostream& printOn(std::ostream& o) const;
我认为这种方法的优点是允许使用链接方法更容易地将基类的输出合并到派生类的输出中。这是一个例子:
std::ostream& DerivedClass::printOn(std::ostream& stream) const
{
return stream
<< "<DerivedClass>" << '\n'
<< BaseClass::printOn(stream)
<< "<member_one>" << member_one_ << "</member_one>" << '\n'
<< "<member_two>" << member_two_ << "</member_two>" << '\n'
<< "</DerivedClass>" << std::endl;
}
相比之下,DerivedClass::printOn
如果虚拟BaseClass::printOn
方法void
如常见问题解答中所示声明,则如下所示:
void DerivedClass::printOn(std::ostream& stream) const
{
stream << "<DerivedClass>" << '\n';
BaseClass::printOn(stream);
stream
<< "<member_one>" << member_one_ << "</member_one>" << '\n'
<< "<member_two>" << member_two_ << "</member_two>" << '\n'
<< "</DerivedClass>" << std::endl;
}
问题:有没有人看到我提议的对返回类型的修改有任何陷阱printOn
?