「不純な仮想関数」とは、診断目的で(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"
...
それは単一のコンパイルされた実装を取得するようになっています。
これは法的なのでしょうか?
ソースファイルに ';'という疑いがあります。 –
@Oli Charlesworth:Trueですが、何か本質的に間違っていますか?とにかく後続する ';'の責任をマクロ定義に移すことで、これは簡単に回避できます。 – jamesdlin
@james:はい、私はそれがコンパイラエラーであると信じています。私はそれが自明に修正可能だと知っていますが、これは偶発的な観察であり、批判ではありません。 –