“不纯虚函数”是指纯虚函数,它们也具有用于诊断目的的实现(如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++ 标准明确禁止这样做(ISO C++ 2003 标准中的第 10.4/2 节)。
作为替代方案,我想到了以下技巧。在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"
...
以便它获得单个编译的实现。
这样做会合法吗?