чистый спецификатор на функциональном определении

При компиляции на 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

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

34
задан Bébul 1 June 2010 в 16:46
поделиться

5 ответов

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


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

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

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

31
ответ дан 27 November 2019 в 16:37
поделиться

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

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

19
ответ дан 27 November 2019 в 16:37
поделиться

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

virtual void Process() = 0 {};

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

12
ответ дан 27 November 2019 в 16:37
поделиться

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

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

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

4
ответ дан 27 November 2019 в 16:37
поделиться

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

0
ответ дан 27 November 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: