C++:如何正確的定義一個接口類

C++中如何定義接口類?

首先給接口類下了定義:接口類應該是隻提供方法聲明,而自身不提供方法定義的抽象類。接口類自身不能實例化,接口類的方法定義/實現只能由接口類的子類來完成。

而對於C++,其接口類一般具有以下特徵:

1.最好不要有成員變量,但可以有靜態常量(static const或enum)

2.要有純虛接口方法

3.要有虛析構函數,並提供默認實現

如下就是一個最簡單的例子:

C++:如何正確的定義一個接口類

#1.

如果成員變量,尤其是可變的成員變量,定義在接口中,等於是把實現細節暴露出來了,不符合接口定義的要求,所以一般不在接口中定義可變的成員變量。

而常量可以定義在接口中,因為有時接口需要返回狀態,而這些狀態可以定義成常量放在接口中。

#2.

由於不能讓接口類自身能夠實例化,並且需要子類必須實現接口暴露的方法,所以接口方法都要聲明成純虛函數。

聲明成純虛函數意味著接口類自身不需要提供方法的定義,方法的定義需要由接口類的子類提供,並且接口類自身也因此變成了抽象類而不能被實例化。

#3.

a). 在使用接口類的指針訪問接口類的子類的實例時,當對接口類的指針做delete時,如果接口類的析構函數不是虛析構函數的話,將只會調用接口類的析構函數,接口類的子類的析構函數將不會被調用,內存洩露將會產生,所以接口類的析構函數必須定義成虛析構函數。

b). 如果接口類的析構函數不提供默認實現,即如果接口類的析構函數是純虛析構函數的話,接口類的子類將被迫必須提供析構函數的實現,這樣對接口類的子類不友好。

c). 在C++11中也可以用: virtual ~Testable() = default; 替代 virtual ~Testable() {};

#4.

不要顯式定義任何的構造函數,但也不要在接口中加入如下代碼來禁止生成構造函數:

C++:如何正確的定義一個接口類

因為C++的調用機制要求子類的構造函數調用時一定會先調用父類的構造函數,如果禁止生成構造函數,代碼編譯時會報錯。如果程序員不顯式的提供構造函數,編譯器也會隱式的加上構造函數的,雖然這些構造函數對於接口類來說實際沒有什麼意義。

C++中如何定義標識接口(marker interface)類?

標識接口是沒有任何方法和屬性的接口。這種接口在java中出現的較多,比如:java.io.Serializable、java.rmi.Remote、java.util.EventListener、java.util.RandomAccess

實現代碼如下:

C++:如何正確的定義一個接口類

#5.

只要對純虛析構函數提供一個默認實現就可以了。這種對純虛函數提供實現的寫法看似很奇怪,但C++的確是支持的。

以上是定義C++接口類的一些重要事項,如果有錯誤或遺漏,請指正。

最後,如果你想學C/C++可以私信小編“01”獲取素材資料以及開發工具和聽課權限哦!


分享到:


相關文章: