Почему basic_streambuf :: pubseekoff () не является чисто виртуальной функцией?

Если вы посмотрите на <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 Компилятор использует ту же технику. Почему двум компиляторам пришлось прибегнуть к seekoff() функции-члены, вместо простого объявления pubseekoff как чисто виртуальный в basic_streambuf и определение его в каждом из производных классов basic_filebuf а также basic_stringbuf?

1

Решение

По той же причине вы обычно не делаете виртуальные функции
общественности. Публичные функции определяют интерфейс и базу
класс должен быть в состоянии захватить их, если он хочет обеспечить соблюдение
этот интерфейс. Есть исключения, когда инверсия управления
участвует, но в большинстве случаев вы просто не делаете виртуальный
функции публичные. Как бы вы вставили до и после условия
проверяет ли ты? (Увидеть
http://www.gotw.ca/publications/mill18.htm, например.)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]