Чего мне сильно не хватает в C++. Точнее, чего наболело за последние дни, при копании большого чужого кода.
·· [Continuing] ··
1. Ключевого слова override
. Модификатор функции-члена класса, обозначает, что данная функция переопределяет функцию класса предка. Компилятор проверяет, что функция с данной сигнатурой действительно есть у предка. Капитально бы облегчило чтение кода и рефакторинг: не было бы опасности поменять сигнатуру у предка и разрушить переопределение. Программер напартачил в куче мест, передавая по значению объекты, которые бы следовало передавать по ссылке, и принципиально не использовал const
, при рефакторинге всё это исправляется и приходится мучительно вычитывать в результатах поиска все определения функций, дабы чего не попортилось. Хорошо ещё, что код используется пока что только в одном проекте.
2. Ключевого слова overload
. Сообщает, что есть несколько функций с таким именем и разной сигнатурой. Для тех же целей.
3. Ключевого слова final
. Запрет на наследование от класса или дальнейшего переопределения функции.
4. Запрета на скрытие функций при наследовании. Например:
class A{
void fn();
};
class B: public A {
void fn( int ); // Скрывает A::fn() - хорошо бы это порождало не warning, а ошибку.
};
5. Обязательное повторение virtual
при перегрузке виртуальных функций. Например:
class A{
virtual void fn();
};
class B: public A {
// Полагаем, что пожелание насчёт override уже выполнено ;-)
override void fn(); // Нельзя!!! Надо так: override virtual void fn().
};
Это просто сильно облегчило бы читабельность. Сам я всегда пишу virtual
при перегрузке.
6. Жёсткий запрет на невиртуальные деструкторы у классов с виртуальными членами.
7. Запрет на виртуальные функции у struct
и невозможность наследовать struct
от class
. В противном случае (как есть сейчас) даже непонятно, нафига в языке два ключевых слова с практически одинаковым смыслом. Лично я понимаю struct
как "низкоуровневую" структуру, которая никогда не содержит скрытых полей (типа указателя на VMT) и прочих "подлостей", имеет однозначное представление в памяти (все поля последовательно, кстати, хорошо бы обозначить, что по умолчанию поля не выравниваются по адресам) и позволяет работать с собой через memset()
, memcpy()
, memmove()
, fread()
, fwrite()
и т.д. Было бы здорово, если бы это было зафиксировано в стандартах языка и компиляторах
Жаль, что хотя C++ и эволюционирует, но подобных вещей ждать не приходится - иначе, порушится совместимость со старым кодом. А вот более молодые языки имеют эти ключевые слова. Чем и хвастаются вполне заслуженно.