web-dev-qa-db-ja.com

「= 0」で終わるC ++ヘッダーファイルと関数宣言

.hファイル内に次のコードがありますが、代入ステートメントが何をするのか、どのように正しく呼び出されるのかわかりません。

virtual void yield() = 0;

この関数はデフォルトで値0を返すと思っていましたが、この関数はvoidを返すため、少し混乱しています。誰かがこれについてコメントし、この割り当てをどのように参照できるかを言うことができますか?つまり、C++の専門用語でどのように呼び出されますか?

ありがとう。

31
Adam

これは純粋仮想関数です。つまり、サブクラスはこの関数を実装する必要があります。そうしないと、サブクラスは抽象的であり、そのクラスのオブジェクトを作成できません。

class ISomeInterface {
public:
    virtual std::string ToString( ) = 0;
}

class SomeInterfaceImpl : public ISomeInterface {
public:
    virtual std::string ToString( ) {
        return "SomeInterfaceImpl";
    }
}

クラスは特定のメソッドを公開できますが、サブクラスはそれを実装する必要があるという考え方です。この例では、ISomeInterfaceToStringメソッドを公開していますが、そのための適切なデフォルト実装がないため、メソッドは純粋に仮想化されています。 SomeInterfaceImplのようなサブクラスは、適切な実装を提供できます。

27
Björn Pollex

= 0構文は 純粋仮想関数 を宣言します。これは戻り値とは関係ありません。

クラスに少なくとも1つの純粋仮想関数が含まれている場合、そのクラスは「抽象」になります。つまり、インスタンス化できません。

実際には、このようなクラスは、仮想関数をサブクラス化して実装することによって具体化する必要があります。

10
unwind

純粋仮想メソッド(別名抽象)の場合は、こちらまたはgoogle http://www.artima.com/cppsource/pure_virtual.html

= 0はデフォルトの戻り値を意味するのではなく、関数が純粋仮想であることを通知します

3
Andrey

構文はあいまいですが、「= 0」は、メソッドが純粋仮想関数であることを示します。それはクラスを抽象化し(インスタンス化することはできません)、その実装は派生クラスに任されます。

これは、定義したいのがインターフェースだけの場合に使用されます。インターフェイスを定義し、デフォルトの実装を提供する場合は、virtualキーワードを使用します。

0
Dave M