Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Void g();






};

 

Существуют разумные причины, запрещающие переопределение функций, но, к сожалению, большая часть примеров, которые я приводил для обоснования необходимости final, основывались на ошибочном предположении, что вызов виртуальных функций является дорогим (в основном на основе опыта работы с другими языками программирования). Так что, если вы добавляете спецификатор final убедитесь в том, что причины обоснованы: будет ли семантическая ошибка в том, что кто-то захочет определить класс, переопределяющий эту виртуальную функцию? Добавление модификатора final, запрещает саму возможность того, что кто-то в будущем сможет предоставить более удачную реализацию вашей функции для класса, о котором вы даже не подозреваете. Если вы не хотите давать такую возможность, то зачем вообще объявлять эту функцию виртуальной? Большинство разумных ответов, с которыми я сталкивался, сводились к следующему: это важная функция фреймворка, она переопределяется разработчиками фреймворка, но не предназначена для переопределения простыми пользователям. Я к таким заявлениям отношусь с подозрением.

Если причина кроется в производительности (возможности inlining-а) или вы просто не хотите, чтобы ее кто-либо переопределял, то значительно проще вообще не делать эту функцию виртуальной. Это не Java.

См. также:

  • Standard: 10 Derived classes [class.derived] [9]
  • Standard: 10.3 Virtual functions [class.virtual]

 

Возможности С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).

См.:

  • Standard: 16.3 Macro replacement.
  • [N1568=04-0008] P.J. Plauger: PROPOSED ADDITIONS TO TR-1 TO IMPROVE COMPATIBILITY WITH C99.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.