2012-08-14 91 views
13

可能重複:
How do you declare an interface in C++?
Interface as in java in c++?相當於C++中的Java接口?

我是一個Java程序員學習C++,我想知道是否有類似的東西在C++ Java接口,即類,其他類可以實現/擴展多個。 謝謝。 p.s.告訴我,如果我做錯了什麼,請在這裏新建一個。

+8

C++支持完整的[多繼承](http://en.wikipedia.org/wiki/Multiple_inheritance),所以在Java和類之間沒有區別。如果您使用所有純虛擬方法創建類,那麼它就等同於Java接口。 – DaoWen 2012-08-14 04:57:35

+0

僅具有純虛擬成員函數的抽象類。 – oldrinb 2012-08-14 04:57:58

+0

還要考慮VC++的'__interface'關鍵字。檢查MSDN。 – MasterMastic 2012-08-14 04:58:57

回答

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。 – 2012-08-14 05:30:54

+0

@ Cheersandhth.-Alf沒錯。感謝您的修復。 – StackedCrooked 2012-08-14 05:35:30

+1

-1,它是*抽象類*,而不是* interface *。你不能通過它的* interface *擁有對象,即* interface *不能擁有公共析構函數。 (除非它是'IDestructible' *接口*)。 – Abyx 2012-08-14 08:51:44

-6

要模擬的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()B2::foo()

B2::foo()是純虛擬的,所以D::B2::foo()也是; B1::foo()不會覆蓋B2::foo(),因爲B2不是派生類B1

因此,D是一個抽象類。

--end示例]

反正爲什麼你會模仿Java的C++中任意限制?

編輯:添加示例澄清。

+0

我通常會盡量避免C++中的多重繼承,所以我從來沒有遇到過虛擬繼承。感謝您的澄清! – DaoWen 2012-08-14 09:26:49

+1

@DaoWen:請注意,這個答案在技術上** **錯誤,並且海報拒絕修正。 – 2012-08-14 10:30:18

+1

@乾杯和hth。 - 阿爾夫:請你詳細說明爲什麼它不正確? – DaoWen 2012-08-14 10:32:42