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では禁止してるのだと思います。