2012-08-14 13 views
13

可能性の重複:
How do you declare an interface in C++?
Interface as in java in c++?C++のJavaインターフェイスに相当しますか?

私はC++を学ぶJavaプログラマだと、C++でのJavaインターフェースのようなものがある場合、私は思っていた、他のクラスすなわちクラス2つ以上の実装/拡張が可能です。おかげさまで p.s.ここに新しい私が何か​​悪いことをすれば教えてください。

+8

C++は完全な[多重継承](http://en.wikipedia.org/wiki/Multiple_inheritance)をサポートしているので、Javaのようなクラスとインタフェースの区別はありません。すべての純粋仮想メソッドを持つクラスを作成すると、それはJavaインターフェイスと同等です。 – DaoWen

+0

純粋な仮想メンバ関数のみを持つ抽象クラス。 – oldrinb

+0

VC++の '__interface'キーワードについても検討してください。 MSDNを確認してください。 – MasterMastic

答えて

20

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. 
    } 
}; 
+2

Javaインターフェイスの実装をエミュレートするには、**仮想継承**が必要です。 FTFY。 –

+0

@ Cheersandhth.-Alfそうです。修正していただきありがとうございます。 – StackedCrooked

+1

-1、* interface *ではなく、* abstract class *です。 * interface *を介してオブジェクトを所有することはできません。つまり、* interface *はパブリックデストラクタを持つことができません。 (それが 'IDestructible' *インターフェース*でない限り)。 – Abyx

-6

のJava interfaceをエミュレートするために、あなただけの純粋仮想関数で通常のベースを使用することができます。

仮想継承を使用する必要がある場合は、継承継承を得ることができます。同じクラスは、C++で複数回基本クラスにすることができます。これは、この場合、この基本クラスのアクセスがあいまいであることを意味します。ジャワ、方法overriderにおいて、一方のみ仮想関数宣言を持つクラスの派生クラスで行うことができる仮想関数をオーバーライドする、C++で:

C++はないは、Java interfaceの正確な等価物を提供しinterfaceでは、基本クラスで宣言できます。

[例:

struct B1 { 
    void foo(); 
}; 

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

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

D継承すぎ関数宣言:B1::foo()B2::foo()

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

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

--end例]

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

EDIT:説明のために追加しました。

+0

私は通常、C++での多重継承を避けようとしています。そのため、以前は仮想継承を経験することはありませんでした。解明してくれてありがとう! – DaoWen

+1

@DaoWen:この回答は技術的には**間違った**であり、ポスターを修正することを拒否しています。 –

+1

@Cheersとhth。 - Alf:なぜそれが間違っているかを詳しく教えていただけますか? – DaoWen

関連する問題