an で終わる関数=0
は a と呼ばれます。これは、特定のコンストラクター (コピー ctor が削除されているdeleted function
など) を使用するオブジェクトが必要ない場合に役立ちます。unique_ptr
関数virtual
が削除されると、標準ではクラスは抽象型になります。ほとんどの場合、クラスのプロトタイプとクラスの関数本体は別々のファイルにあるため、削除された仮想関数をオーバーライドしていることをプロトタイプで明示的に概説しない限り、削除された仮想関数をオーバーライドしていないことを意味します。コンパイラは、まったく別のファイルで実装を確認すると、そこに関数を配置するつもりだったと単純に推測するだけではありません。
プロトタイプ/実装のアイデアがコードを記述する唯一の方法ではないことを覚えておいてください。実装をクラスに正しく配置することもできます (コードが十分に小さく、関数をインライン化したい場合に実行できます)。もう一度、削除された仮想機能を明示的にオーバーライドする必要があります。とにかくオーバーライドする必要があるため、プロトタイプで明示的にオーバーライドする必要があることは完全に理にかなっています。それ以外の場合、関数は引き続き削除されます。
具体的な例として、List.hpp、List.cpp、main.cpp があるとします。
List.hpp には、抽象クラスと、抽象クラスから継承する通常のクラスがあります。#include "List.hpp"
List.cpp ではなく、主にあなたですよね?そのため、コンパイラはそのファイルの内容を (コンパイルを試みるまで) 認識しません。削除された仮想関数がオーバーライドされていない場合、コンパイラは単に抽象クラスをインスタンス化しようとしているだけであると判断し、エラーをスローします。
一方、List.cpp をコンパイルしている場合、コンパイラはエラーをスローします。今回は、記述しようとしている関数が実際には定義されていないことを訴えます。Base::deletedFunction()
とは異なるからですDerived::deletedFunction()
。