Если посмотреть на <streambuf>
заголовочный файл в VS2010 вы увидите определение этой функции-члена, какПочему 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