私が試した 2 つのコンパイラはこの構文を受け入れましたが、純粋な仮想デストラクタの定義は常にクラスの外にある必要があることをどこかで読みました。コンパイルする私のコード:
class AbstractBase
{
public:
virtual ~AbstractBase() = 0
{}
virtual void foo()
{
...
}
};
私が試した 2 つのコンパイラはこの構文を受け入れましたが、純粋な仮想デストラクタの定義は常にクラスの外にある必要があることをどこかで読みました。コンパイルする私のコード:
class AbstractBase
{
public:
virtual ~AbstractBase() = 0
{}
virtual void foo()
{
...
}
};
標準によると、クラス本体内で純粋仮想関数を定義することはできません。
ただし、一部のコンパイラは、この機能を拡張機能としてサポートしています。この拡張機能を使用すると、異なるコンパイラ間でコードを移植できなくなることに注意してください。
参照:
C++03 10.4 段落 2:
[注: 関数宣言は、pure-specifier と定義の両方を提供することはできません — 終わりの注] [例:
struct C { virtual void f() = 0 { }; // ill-formed };
—終わりの例]
= 0
構文では両方を同時に使用することはできないため{ }
、.cpp ファイルのように、デストラクタを個別に定義する必要があります。
一部のコンパイラでは、バージョンを拡張機能として許可する場合があります。
Microsoft Visual Studioはこの構文を受け入れ、率直に言って、gccコンパイラーもこれに不満を持っているようには見えません。ただし、心配する必要があるのはコンパイラではなく、リンカです。クラス定義内(ヘッダーファイル内)に純粋な仮想デストラクタを定義すると、同じシンボルが複数定義されます。MSVCコンパイラがこのケースをどの程度正確に処理するかは100%わかりませんが、gccが文句を言う可能性があります。また、MSVCを使用している場合でも、プロジェクトが大きくなり、複数の静的/動的ライブラリに分割されると、問題が発生する可能性があります。