簡體   English   中英

c ++類似於Java的“接口”類?

[英]c++ “interface”-like classes similar to Java?

在Java中,可以將接口定義為沒有實際代碼實現的類,而只能定義類必須實現的方法。 這些類型可以作為參數傳遞給方法,並從方法返回。 據我所知,在C ++中,純虛擬類不能用作參數或返回類型。 有什么方法可以模仿Java的接口類?

我在C ++中有一個字符串類,還有幾個用於從基本字符串類派生的不同編碼(例如UTFxxx,ISOxxx等)的子類。 但是,由於存在許多不同的編碼,因此基類沒有有意義的實現。 但是,如果我可以將其作為自己的對象來處理,並且將對該對象的調用將調用其繼承的正確子類,則它將很好地用作接口。

如果僅使用引用或指針,則純虛擬類可用作返回類型。

實際上,在Java中, Interface foo = Implementer(); 等效於Interface* foo = Implementer(); implements Foopublic virtual Foo

這是一個Java示例:

interface Foo {
    public void doFoo();
}
class Bar implements Foo {
    public void doFoo() { }
}

其C ++對應物:

struct Foo {
    virtual void doFoo() = 0;
    virtual ~Foo() { }
};
class Bar : public virtual Foo {
public:
    virtual void doFoo() { }
    virtual ~Bar() { }    
};

正確的是,如果使用Foo foo; ,C ++會抱怨類型不完整Foo foo; 需要使用Foo& fooFoo* foosmart_pointer<Foo> foo

在此示例中, smart_pointer可以是scoped_ptrunique_ptrshared_ptr ,具體取決於您是否要

  • 只是一個在銷毀時delete()s智能指針
  • 具有移動語義的智能指針
  • 引用計數的智能指針

請注意,如果要使用boost智能指針,請使用get() / reset()語義獲取和設置指針值。

您不能按值使用純虛擬類,但可以按指針或按引用傳遞它。 這包括將其傳遞給包裹在智能指針類型(例如unique_ptrshared_ptr

您還應確保使用virtual關鍵字在接口上標記析構函數,以防止潛在的內存泄漏。

您當然可以使用類似接口的類,但這不是語言的構造,它只是具有純虛方法的類。 記住,接口只是Java如何進行多重繼承而沒有所有棘手的問題(一個祖父母類的兩個副本,多個具有相同名稱的變量,等等)

這是Google C ++風格的接口定義:

如果一個類滿足以下要求,則它是純接口:

  • 它僅具有公共純虛擬(“ = 0”)方法和靜態方法(但有關析構函數,請參見下文)。
  • 它可能沒有非靜態數據成員。
  • 它不需要定義任何構造函數。 如果提供了構造函數,則該構造函數必須不帶任何參數並且必須受到保護。
  • 如果它是子類,則只能從滿足這些條件並使用接口后綴標記的類派生。

由於接口類聲明了純虛方法,因此永遠不能直接實例化它。 為了確保可以正確銷毀該接口的所有實現,該接口還必須聲明一個虛擬析構函數(除第一個規則以外,它不應是純凈的)。 有關詳細信息,請參見Stroustrup,C ++編程語言,第三版,第12.4節。

看看Google C ++樣式指南的“多重繼承”和“接口”部分。 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM