Два компилятора, которые я попробовал, принимают этот синтаксис, но я где-то читал, что определение чистого виртуального деструктора всегда должно быть за пределами класса.
Мой код, который компилируется:
class AbstractBase
{
public:
virtual ~AbstractBase() = 0
{}
virtual void foo()
{
...
}
};
Согласно стандарту вы не можете определить чисто виртуальную функцию внутри тела класса.
Однако некоторые компиляторы поддерживают эту функцию как расширение. Обратите внимание, что использование этого расширения сделает ваш код непереносимым для разных компиляторов.
Ссылка:
C ++ 03 10.4 пункт 2:
[Примечание: объявление функции не может предоставить ни чистый спецификатор, ни определение — конечное примечание] [Пример:struct C { virtual void f() = 0 { }; // ill-formed };
— конец примера]
Синтаксис не учитывает оба = 0
а также { }
в то же время, так что вы должны определить деструктор отдельно, как в файле .cpp.
Некоторые компиляторы могут разрешить вашу версию в качестве расширения.
Microsoft Visual Studio принимает этот синтаксис и, честно говоря, gcc компилятор также не кажется, что недоволен этим.
Однако вам следует беспокоиться не о компиляторе, а о компоновщике.
Определение чистого виртуального деструктора внутри определения класса (в заголовочном файле) приводит к множественному определению одного и того же символа. Я не уверен на 100%, как именно MSVC complier обрабатывает этот случай, но gcc может пожаловаться. Кроме того, даже с MSVC вы можете столкнуться с проблемой, когда проекты растут и разделяются на несколько статических / динамических библиотек.