28

重複の可能性:
C ++でインターフェイスをどのように宣言しますか?
C ++のJavaのようなインターフェース?

私はC++を学習しているJavaプログラマーですが、C ++にJavaインターフェイスのようなもの、つまり、別のクラスが複数のクラスを実装/拡張できるクラスがあるかどうか疑問に思っていました。ありがとう。psここで新しいので、何か間違ったことをしたかどうか教えてください。

4

2 に答える 2

32

C++ では、純粋仮想メソッドのみを含むクラスはインターフェイスを示します。

例:

// Define the Serializable interface.
class Serializable {
     // virtual destructor is required if the object may
     // be deleted through a pointer to Serializable
    virtual ~Serializable() {}

    virtual std::string serialize() const = 0;
};

// Implements the Serializable interface
class MyClass : public MyBaseClass, public virtual Serializable {
    virtual std::string serialize() const { 
        // Implementation goes here.
    }
};
于 2012-08-14T04:58:16.323 に答える
-5

Java をエミュレートするinterfaceには、純粋な仮想関数のみを持つ通常のベースを使用できます。

仮想継承を使用する必要があります。そうしないと、継承が繰り返される可能性があります。C++ では、同じクラスが複数回基底クラスになる可能性があります。これは、この場合、この基本クラスへのアクセスがあいまいになることを意味します。

C++ はJava とまったく同等のものを提供しませinterface。C++ では、仮想関数のオーバーライドは、仮想関数宣言を持つクラスの派生クラスでのみ実行できますが、Java では、メソッドのオーバーライドはinterfaceで宣言できます。基本クラス。

[例:

struct B1 {
    void foo ();
};

struct B2 {
    virtual void foo () = 0;
};

struct D : B1, B2 {
    // no declaration of foo() here
};

Dも関数宣言を継承します: B1::foo()and B2::foo().

B2::foo()純粋な仮想D::B2::foo()です。の派生クラスではないため、B1::foo()オーバーライドしません。B2::foo()B2B1

したがって、D抽象クラスです。

--終わりの例]

とにかく、なぜ Java の任意の制限を C++ でエミュレートするのでしょうか?

編集:明確にするために例を追加しました。

于 2012-08-14T06:06:30.187 に答える