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;
}
対照的に、FAQに示されているように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
か?