Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Void g();
};
Существуют разумные причины, запрещающие переопределение функций, но, к сожалению, большая часть примеров, которые я приводил для обоснования необходимости final, основывались на ошибочном предположении, что вызов виртуальных функций является дорогим (в основном на основе опыта работы с другими языками программирования). Так что, если вы добавляете спецификатор final убедитесь в том, что причины обоснованы: будет ли семантическая ошибка в том, что кто-то захочет определить класс, переопределяющий эту виртуальную функцию? Добавление модификатора final, запрещает саму возможность того, что кто-то в будущем сможет предоставить более удачную реализацию вашей функции для класса, о котором вы даже не подозреваете. Если вы не хотите давать такую возможность, то зачем вообще объявлять эту функцию виртуальной? Большинство разумных ответов, с которыми я сталкивался, сводились к следующему: это важная функция фреймворка, она переопределяется разработчиками фреймворка, но не предназначена для переопределения простыми пользователям. Я к таким заявлениям отношусь с подозрением. Если причина кроется в производительности (возможности inlining-а) или вы просто не хотите, чтобы ее кто-либо переопределял, то значительно проще вообще не делать эту функцию виртуальной. Это не Java. См. также:
Возможности С99 Для сохранения высокой степени совместимости, при содействии комитета по стандартизации языка С, в С++ были внесены несколько небольших изменений. · long long. · Extended integral types (например, правила для опциональных типов, больших чем int). · UCN changes [N2170==07-0030] ``lift the prohibitions on control and basic source universal character names within character and string literals.'' · Конкатенация узких/широких строк. · Не были внесены изменения VLA (Variable Length Arrays; слава небесам за это). Были добавлены несколько расширений препроцессора: · __func__ - максро, который разворачивается в имя лексически текущей функции · __STD_C_HOSTED__ · _Pragrma: _Pragma(X) разворачивается в #pragma X · макрос vararg (перегрузка макросов с разным числом аргументов) #define report(test,...) ((test)? puts(#test): printf(_ _VA_ARGS_ _))
· пустые аргументы макросов Были добавлены возможности стандартной библиотеки из C99 (по сути, все изменения С99 по сравнению с предшественником С89). См.:
|