C++ 11では、派生した仮想メソッドで "= default"を使用しても純粋な基本クラスの実装は選択されません。C++ 11 =既定の純粋な実装を指定するための仮想関数の既定キーワード
たとえば、次のテストコードでは、 "g ++ -std = C++ 11"から "error: 'virtual void B :: tst()'をデフォルトにできません。
struct A {
virtual ~A() = default;
virtual void tst() = 0;
};
void A :: tst() {}
struct B : public A {
virtual void tst() = default;
};
それは、デフォルトの基本実装を呼び出すTST我々はもちろん:: Bを提供することができますが、一つは、これは架空の「=デフォルト」ベースの符号化に比べて高いオーバーヘッド実装かもしれないと懸念しています。
C++標準委員会のメンバーの中に何があるかもしれないかということについて申し訳ありませんが、おそらく多分スタックオーバーフロー時の誰かがこのようにデフォルトキーワードを使用することの非現実性に関する知恵を持っています。聞くのが面白いです。
ありがとうございます!
デフォルトでは、子クラスは親が非公開で継承すると仮定して、何も記述せずに親の実装を共有します。したがって、この文脈では、 '= default'を意味するものは何ですか? – md5i
仮想関数が純粋な場合、派生クラスが実装を選択する必要があります。派生クラスは、実装を提供するか、ベース内のデフォルトの実装を呼び出すことを選択できます。しかし、=デフォルトでは、コンパイラによってvtableにロードされるだけの基本デフォルトを指定することが潜在的に可能であり、派生した実装へのディスパッチに比べて潜在的に効率的です。しかし、コンパイル時に派生クラスを選択するためには、それを重要な設計上の選択とみなします。 –