[英]c++ “interface”-like classes similar to Java?
在Java中,可以將接口定義為沒有實際代碼實現的類,而只能定義類必須實現的方法。 這些類型可以作為參數傳遞給方法,並從方法返回。 據我所知,在C ++中,純虛擬類不能用作參數或返回類型。 有什么方法可以模仿Java的接口類?
我在C ++中有一個字符串類,還有幾個用於從基本字符串類派生的不同編碼(例如UTFxxx,ISOxxx等)的子類。 但是,由於存在許多不同的編碼,因此基類沒有有意義的實現。 但是,如果我可以將其作為自己的對象來處理,並且將對該對象的調用將調用其繼承的正確子類,則它將很好地用作接口。
如果僅使用引用或指針,則純虛擬類可用作返回類型。
實際上,在Java中, Interface foo = Implementer();
等效於Interface* foo = Implementer();
並implements Foo
是public 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& foo
, Foo* foo
或smart_pointer<Foo> foo
。
在此示例中, smart_pointer
可以是scoped_ptr
, unique_ptr
或shared_ptr
,具體取決於您是否要
delete()s
智能指針 請注意,如果要使用boost智能指針,請使用get()
/ reset()
語義獲取和設置指針值。
您不能按值使用純虛擬類,但可以按指針或按引用傳遞它。 這包括將其傳遞給包裹在智能指針類型(例如unique_ptr
或shared_ptr
。
您還應確保使用virtual
關鍵字在接口上標記析構函數,以防止潛在的內存泄漏。
您當然可以使用類似接口的類,但這不是語言的構造,它只是具有純虛方法的類。 記住,接口只是Java如何進行多重繼承而沒有所有棘手的問題(一個祖父母類的兩個副本,多個具有相同名稱的變量,等等)
這是Google C ++風格的接口定義:
如果一個類滿足以下要求,則它是純接口:
由於接口類聲明了純虛方法,因此永遠不能直接實例化它。 為了確保可以正確銷毀該接口的所有實現,該接口還必須聲明一個虛擬析構函數(除第一個規則以外,它不應是純凈的)。 有關詳細信息,請參見Stroustrup,C ++編程語言,第三版,第12.4節。
看看Google C ++樣式指南的“多重繼承”和“接口”部分。 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.