3

私が試した 2 つのコンパイラはこの構文を受け入れましたが、純粋な仮想デストラクタの定義は常にクラスの外にある必要があることをどこかで読みました。コンパイルする私のコード:

class AbstractBase
{
public:
    virtual ~AbstractBase() = 0
    {}

    virtual void foo()
    {
        ...
    }
};
4

3 に答える 3

7

標準によると、クラス本体内で純粋仮想関数を定義することはできません。
ただし、一部のコンパイラは、この機能を拡張機能としてサポートしています。この拡張機能を使用すると、異なるコンパイラ間でコードを移植できなくなることに注意してください。

参照:

C++03 10.4 段落 2:

[注: 関数宣言は、pure-specifier と定義の両方を提供することはできません — 終わりの注] [例:

struct C 
{ 
    virtual void f() = 0 { }; // ill-formed 
}; 

—終わりの例]

于 2012-09-25T06:53:04.940 に答える
2

= 0構文では両方を同時に使用することはできないため{ }、.cpp ファイルのように、デストラクタを個別に定義する必要があります。

一部のコンパイラでは、バージョンを拡張機能として許可する場合があります。

于 2012-09-25T06:36:49.847 に答える
1

Microsoft Visual Studioはこの構文を受け入れ、率直に言って、gccコンパイラーもこれに不満を持っているようには見えません。ただし、心配する必要があるのはコンパイラではなく、リンカです。クラス定義内(ヘッダーファイル内)に純粋な仮想デストラクタを定義すると、同じシンボルが複数定義されます。MSVCコンパイラがこのケースをどの程度正確に処理するかは100%わかりませんが、gccが文句を言う可能性があります。また、MSVCを使用している場合でも、プロジェクトが大きくなり、複数の静的/動的ライブラリに分割されると、問題が発生する可能性があります。

于 2012-09-25T06:42:11.247 に答える