Под «нечистой виртуальной функцией» я подразумеваю чисто виртуальные функции, которые также имеют реализации (как описано в http://www.gotw.ca/gotw/031.htm) для диагностических целей.
Кошерный способ их реализации заключается в следующем:
class Foo
{
public:
...
virtual void Bar() = 0;
};
void Foo::Bar() { assert(false); }
Но это довольно утомительно, особенно если в классе есть несколько чисто виртуальных методов, а также трудно гарантировать, что кто-то случайно не добавит новую чисто виртуальную функцию без добавлениясоответствующая реализация.
В идеале я хотел бы сделать следующее:
class Foo
{
public:
...
virtual void Bar() = 0
{
assert(false);
}
};
, но стандарт C ++ явно запрещает это (раздел 10.4 / 2 в стандарте ISO C ++ 2003).
В качестве альтернативы я подумал о следующем взломе: в заголовке Foo.h
:
#ifndef ABSTRACT_METHOD
#define ABSTRACT_METHOD = 0
#endif
class Foo
{
public:
...
virtual void Bar() ABSTRACT_METHOD;
};
, а затем в соответствующем исходном файле Foo.cpp
:
#define ABSTRACT_METHOD { assert(false); }
#include "Foo.h"
...
чтобы получить одну скомпилированную реализацию.
Будет ли это допустимо?