При компиляции на 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
Что делает ошибочные средства? Почему я не могу сделать этого встроенный? Действительно ли законно уклониться от проблемы компиляции как показано во втором примере кода?
Так, я только что узнал кое-что. Чистая виртуальная функция должна быть объявлена следующим образом:
class Abstract
{
public:
virtual void pure_virtual() = 0;
};
Она может иметь тело, хотя включать его в момент объявления запрещено. Это означает, что для того, чтобы иметь тело, чистая виртуальная функция должна быть определена вне класса. Обратите внимание, что даже если у функции есть тело, она все равно должна быть переопределена любыми конкретными классами, производными от Abstract
. У них просто будет возможность вызвать Abstract::pure_virtual()
явно, если им это понадобится.
Подробности здесь.
Стандарт C ++, 10.4 / 2:
объявление функции не может предоставлять как чистый спецификатор, так и определение
Этот синтаксис:
virtual void Process() = 0 {};
не является легальным C++, но поддерживается VC++. Почему стандарт запрещает это, я так и не понял. Ваш второй пример легален.
Чисто виртуальные функции в C++ по определению не имеют определения в объявлении .
Второй блок кода не обходит проблему компилятора. Он реализует чистую виртуальную функцию так, как она была задумана.
Вопрос в том, зачем вам нужно объявлять ее чисто виртуальной, если вы собираетесь иметь реализацию по умолчанию?
Вы, безусловно, можете предоставить тело для чисто виртуальной функции. На эту функцию будет указывать этот абстрактный класс vtable. В противном случае тот же слот будет указывать на специфичную для компилятора функцию прерывания, например __ cxa_pure_virtual
для GCC. В стандарте, конечно, ничего об этом нет.