2016-05-12 7 views
0

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++標準委員会のメンバーの中に何があるかもしれないかということについて申し訳ありませんが、おそらく多分スタックオーバーフロー時の誰かがこのようにデフォルトキーワードを使用することの非現実性に関する知恵を持っています。聞くのが面白いです。

ありがとうございます!

+0

デフォルトでは、子クラスは親が非公開で継承すると仮定して、何も記述せずに親の実装を共有します。したがって、この文脈では、 '= default'を意味するものは何ですか? – md5i

+0

仮想関数が純粋な場合、派生クラスが実装を選択する必要があります。派生クラスは、実装を提供するか、ベース内のデフォルトの実装を呼び出すことを選択できます。しかし、=デフォルトでは、コンパイラによってvtableにロードされるだけの基本デフォルトを指定することが潜在的に可能であり、派生した実装へのディスパッチに比べて潜在的に効率的です。しかし、コンパイル時に派生クラスを選択するためには、それを重要な設計上の選択とみなします。 –

答えて

1

標準8.4.2/P1明示的不履行関数[dcl.fct.def.default]強調鉱山)によれば:

A function definition of the form:

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt = default;

is called an explicitly-defaulted definition. A function that is explicitly defaulted shall

(1.1) — be a special member function,

(1.2) — have the same declared function type (except for possibly differing ref-qualifiers and except that in the case of a copy constructor or copy assignment operator, the parameter type may be “reference to non-const T”, where T is the name of the member function’s class) as if it had been implicitly declared, and

(1.3) — not have default arguments

メンバ関数tst()special member functionありません。したがって、デフォルトにすることはできません。

クラスのメンバ関数(たとえばclass A)を純粋な仮想として指定すると、そのクラスから継承し、抽象化したくないクラスはそのメンバ関数をオーバーライドする必要があります。

+0

OK、標準では、このタイプの純粋な基本クラスのデフォルトの実装では動作を選択できないと言われていますが、それにもかかわらず、 –

関連する問題