Я немного расскажу о ответе user5609829, так как считаю, что другие решения здесь слишком сложны / слишком много работают. Применение margin-right: -4px
к встроенным блочным элементам приведет к удалению интервала и будет поддерживаться всеми браузерами. См. Обновленную скрипту здесь . Для тех, кто занимается использованием отрицательных полей, попробуйте дать этот прочитанный.
Ваше предположение, что чистая виртуальная функция не может быть вызвано, абсолютно неверна. Когда функция объявляется чистой виртуальной, это просто означает, что эта функция не может быть вызвана динамически посредством виртуального механизма отправки. Тем не менее, эту же самую функцию можно легко называть статически , не виртуально , непосредственно (без виртуальной отправки).
На языке C ++ не виртуальный вызов виртуальной функции выполняется, когда в вызове используется квалифицированное имя функции, т. е. когда имя функции, указанное в вызове, имеет форму <class name>::<function name>
.
Например,
struct S
{
virtual void foo() = 0;
};
void S::foo()
{
// body for pure virtual function `S::foo`
}
struct D : S
{
void foo()
{
S::foo();
// Non-virtual call to `S::foo` from derived class
this->S::foo();
// Alternative syntax to perform the same non-virtual call
// to `S::foo` from derived class
}
};
int main()
{
D d;
d.S::foo();
// Another non-virtual call to `S::foo`
}
Для большинства чистых виртуальных функций вы были бы правы. Однако для чистого виртуального деструктора на самом деле важно определить соответствующую реализацию деструктора:
«Эффективный C ++» Майерс упоминает, почему чистая виртуальная функция имеет тело: производные классы, реализующие эту чистую виртуальную функцию, могут вызывать эту реализацию smwhere в своем коде. Если часть кода двух разных производных классов схожа, тогда имеет смысл перемещать ее в иерархии, даже если функция должна быть чистой виртуальной.
blockquote>см. Здесь здесь .