Чистые виртуальные функции являются функциями-членами, которые являются виртуальными и имеют чисто-спецификатор (= 0;
)Чистые виртуальные функции могут не иметь встроенного определения. Зачем?
Статья 10.4 пункт 2 из C++ 03 говорит нам, что абстрактный класс и, как примечание стороны, следующее:
[Примечание: объявление функции не может обеспечить как чисто-спецификатор и определение -end примечание] [Пример:
struct C {
virtual void f() = 0 { }; // ill-formed
};
-end пример]
Для тех, кто не очень хорошо знакомы с проблемой, пожалуйста, обратите внимание, что чистые виртуальные функции могут иметь определения но вышеупомянутая статья запрещает такие определения появляться inline (лексически в классе). (Для целей использования чистых виртуальных функций вы можете видеть, например, this GotW)
Теперь для всех других видов и типов функций разрешено предоставлять определение в классе, и это ограничение кажется на первый взгляд абсолютно искусственным и необъяснимо. Подумайте об этом, кажется, это на втором и последующих взглядах :) Но я считаю, что ограничение не было бы там, если бы для этого не было конкретной причины.
Мой вопрос: кто-нибудь знаю эти конкретные причины? Хорошо Догадки также приветствуются.
Примечания:
- MSVC Допускает ПВФ, чтобы иметь определения инлайн. Так что не удивляйтесь :)
- слово
inline
в этом вопросе не относится к ключевому слову inline. Это должно означать лексический в классе
Выглядит немного странно при использовании функции try block: 'virtual void f() = 0 try {} catch (...) {}' –
Вот угадай: было проще создать компилятор, который не разрешить его и, учитывая его очень редкое использование, было легким решением. Тот факт, что некоторые компиляторы (вы цитировали MSVC) действительно позволяют это просто означает, что некоторые авторы компилятора не были обеспокоены дополнительной работой. – Tergiver
@Johannes: Что в этом странно? Функциональные блоки try сами по себе странные :) –