чистый спецификатор на определение функции - PullRequest
33 голосов
/ 01 июня 2010

При компиляции в GCC я получаю ошибку : чистый спецификатор для определения функции , но не при компиляции того же кода с использованием VS2005.

class Dummy {   
  //error: pure-specifier on function-definition, VS2005 compiles 
  virtual void Process() = 0 {};
};

Но когда определение этой чисто виртуальной функции не является встроенным, оно работает:

class Dummy
{
  virtual void Process() = 0;
};
void Dummy::Process()
{} //compiles on both GCC and VS2005

Что означает ошибка? Почему я не могу сделать это встроенным? Законно ли уклоняться от проблемы компиляции, как показано во втором примере кода?

Ответы [ 6 ]

30 голосов
/ 01 июня 2010

Хорошо, я только что чему-то научился. Чистая виртуальная функция должна быть объявлена ​​следующим образом:


class Abstract 
{
public:
   virtual void pure_virtual() = 0;
};

У него может быть тело, хотя незаконно включать его в пункт объявления. Это означает, что для того, чтобы иметь тело, чистая виртуальная функция должна быть определена вне класса. Обратите внимание, что даже если у нее есть тело, функция все равно должна быть переопределена любыми конкретными классами, производными от Abstract. У них просто будет возможность явно вызвать Abstract::pure_virtual(), если потребуется.

Подробности здесь .

19 голосов
/ 01 июня 2010

C ++ Стандарт, 10,4 / 2:

объявление функции не может предоставить ни чистый спецификатор, ни определение

12 голосов
/ 01 июня 2010

Этот синтаксис:

virtual void Process() = 0 {};

не является допустимым C ++, но поддерживается VC ++. Почему Стандарт запрещает это, мне никогда не было понятно. Ваш второй пример правомерен.

4 голосов
/ 01 июня 2010

Чистые виртуальные функции в C ++ по определению не имеют определения в объявлении .

Ваш второй блок кода не избегает проблемы с компилятором. Он реализует чисто виртуальную функцию так, как это было задумано.

Вопрос, который нужно задать, - зачем вам объявлять его чисто виртуальным, если вы хотите иметь реализацию по умолчанию?

3 голосов
/ 19 апреля 2015

Это категорически запрещено - декларатор, который может включать pure-спецификаторы , т. Е. член-декларатор , появляется только в объявлениях, которые не являются определениями,[class.mem]:

объявление члена :
атрибут-спецификатор-seq опция decl-specier-seq opt список-объявлений-членов opt ;
определение функции
[...]

список участников-объявлений :
член-объявлений
член-объявлений-list , член-декларатор

член-декларатор :
декларатор virt-specier-seq opt pure-спецификатор opt
декларатор-скобка или равный инициализатор opt
идентификатор опт атрибут-спецификатор-секв опт : константа-выражение

Грамматика определения функции не включает спецификатор чистого текста , [dcl.fct.def.general]:

функция четкости :
атрибут-спецификатор-секв опт декл-спецификатор-секв опт декларатор virt-спецификатор-секв opt function-body

0 голосов
/ 01 июня 2010

Вы, конечно, можете предоставить тело для чисто виртуальной функции. Эта функция будет указана этим абстрактным классом vtable. В противном случае тот же слот будет указывать на специфичную для компилятора функцию прерывания, например __cxa_pure_virtual для GCC В стандарте, конечно, об этом ничего нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...