如果你在VS2010看<streambuf>
頭文件,你會看到這個成員函數的定義爲什麼basic_streambuf :: pubseekoff()不是純虛函數?
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
編譯器使用相同的技術。爲什麼兩個編譯器不得不求助於seekoff()
成員函數,而不是簡單地將pubseekoff
聲明爲basic_streambuf
中的純虛函數,並將其定義在派生類basic_filebuf
和basic_stringbuf
的每一箇中?
可能是因爲標準規定呢? – PlasmaHH 2013-02-22 13:46:19