1

<streambuf>VS2010のヘッダーファイルを見ると、このメンバー関数の定義が次のようになっていることがわかります。

pos_type pubseekoff(off_type _Off, ios_base::seekdir _Way,
                ios_base::openmode _Mode = ios_base::in | ios_base::out)
{   // change position by _Off, according to _Way, _Mode
    return (seekoff(_Off, _Way, _Mode));
}

ここseekoffで、は仮想関数です。これは派生クラスでオーバーライドされ、basic_filebuf以下に示すようbasic_stringbufに基本クラスでは何も実行しません。basic_streambuf

virtual pos_type seekoff(off_type, ios_base::seekdir,
                         ios_base::openmode = ios_base::in | ios_base::out)
{   // change position by offset, according to way and mode
    return (streampos(_BADOFF));
}

の定義が見つかりませんでし_BADOFFたが、おそらく-1です。しかし、それはここでは本当に重要ではありません。クラスは抽象クラスであるため(そのコンストラクターは保護されているため) 、この関数もpubseekoff呼び出されることもありません。basic_streambuf

gccコンパイラが同じ手法を使用していることにも注意してください。なぜ2つのコンパイラは、純粋な仮想として宣言し、派生クラスのそれぞれでそれを定義するのでseekoff()はなく、メンバー関数に頼らなければならなかったのですか?pubseekoffbasic_streambufbasic_filebufbasic_stringbuf

4

1 に答える 1

3

同じ理由で、通常は仮想関数を公開しません。パブリック関数はインターフェイスを定義し、そのインターフェイスを適用する場合は、基本クラスがそれらをキャプチャできる必要があります。制御の反転が含まれる場合は例外がありますが、ほとんどの場合、仮想関数を公開しないだけです。事前条件と事後条件のチェックを挿入した場合、どのように挿入しますか?( たとえば、http://www.gotw.ca/publications/mill18.htmを参照してください。)

于 2013-02-22T13:47:22.617 に答える