読者です 読者をやめる 読者になる 読者になる

delete指定された仮想関数

C++

Deleting virtual functions in C++0x - StackOverflow


C++11の仕様的には、仮想関数のdeleteを認めている、というか禁止してないらしい。

virtual int derive_func() = delete;

でもこれはいったいどんな効果・用途なのでしょうか。


N3337の仕様上では、deleteされた仮想関数自体の仕様はとくに書かれていませんが、提案文書のN2326には以下の文言があります。

A deleted virtual function may not override a non-deleted virtual function and vice-versa.
deleteされた仮想関数は、非deleteされた仮想関数とは逆にオーバーライドされない。

これだけ見ると、finalと似た用途のように見えます。
「オーバーライドせず、使用もしないことを派生クラス側で明示する」ということに使えるのかなと思います。とりあえず、GCC 4.7では以下のコードが通りました。

struct Base {
    virtual void f() {}
};

struct Derived {
    virtual void f() = delete;
};

int main()
{
    Derived d;
//  d.f(); // エラー!deleteされた関数Derived::f()を呼び出せない
}

追記:間違い。継承してませんでした

#include <iostream>

struct Base {
    virtual void f() {}
};

struct Derived : Base {
    virtual void f() = delete; // エラー!Derived::f()をdeleteした
};

int main()
{
    Derived d;
//  d.f();
}

謎です。
おそらく、コンパイラがどう実装していいかわからなくてGCC 4.7では禁止してるのだと思います。