Обновление xserver-xorg-input-synaptics пакета от точно предложенного должно устранить Вашу проблему.
Для получения дополнительной информации проверка https://bugs.launchpad.net/bugs/982771 (комментарий № 6 для точно предложенного включения).
Я полностью согласен с вашим обоснованием. Это хорошее напоминание о том, что при вызове метода будет использоваться семантика динамической отправки. Аргумент «этот метод не виртуальный», который использует ваш коллега, является полностью надуманным. Он смешал понятия виртуального и чисто-виртуального.
Добавление виртуального
не оказывает значительного влияния. Я предпочитаю это, но это действительно субъективный вопрос. Однако, если вы обязательно используете ключевые слова override
и sealed
в Visual C ++ , вы значительно улучшите способность обнаруживать ошибки во время компиляции.
Я включаю в свой PCH следующие строки:
#if _MSC_VER >= 1400
#define OVERRIDE override
#define SEALED sealed
#else
#define OVERRIDE
#define SEALED
#endif
. Я бы не стал использовать какой-либо синтаксис, который компилятор позволяет мне опустить. При этом часть дизайна C # (в попытке улучшить по сравнению с C ++) заключалась в том, чтобы требовать, чтобы переопределения виртуальных методов были помечены как «переопределение», и это кажется разумной идеей. Меня беспокоит то, что, поскольку это совершенно необязательно, это только вопрос времени, когда кто-то его пропустит, и к тому времени у вас появится привычка ожидать, что переопределения будут указаны "виртуально". Может быть, тогда лучше просто жить в рамках ограничений языка.
Часть дизайна C # (в попытке улучшить по сравнению с C ++) заключалась в том, чтобы требовать, чтобы переопределения виртуальных методов были помечены как «переопределение», и это кажется разумной идеей. Меня беспокоит то, что, поскольку это совершенно необязательно, это только вопрос времени, когда кто-то его пропустит, и к тому времени у вас появится привычка ожидать, что переопределения будут указаны "виртуально". Может быть, тогда лучше просто жить в рамках ограничений языка. Часть дизайна C # (в попытке улучшить по сравнению с C ++) заключалась в том, чтобы требовать, чтобы переопределения виртуальных методов были помечены как «переопределение», и это кажется разумной идеей. Меня беспокоит то, что, поскольку это совершенно необязательно, это только вопрос времени, когда кто-то его пропустит, и к тому времени у вас появится привычка ожидать, что переопределения будут указаны "виртуально". Может быть, тогда лучше просто жить в рамках ограничений языка.Функция, которая когда-то была виртуальной, всегда была виртуальной .
Таким образом, в любом случае, если ключевое слово virtual не используется в последующих классах, это не препятствует тому, чтобы функция / метод были виртуальными. 'т.е. быть переопределенным. Итак, один из проектов, над которым я работал, содержал следующие рекомендации, которые мне отчасти понравились:
/ * виртуальный * / void guiFocusEvent ();
C ++ 11 используйте ключевое слово final вместе с ключевым словом override
Пример: void guiFocusEvent () override final;
Я могу вспомнить один недостаток: Если функция-член класса не переопределена и вы объявляете ее виртуальной, вы добавляете ненужную запись в виртуальную таблицу для определения этого класса.