1. 如果乙個類b在語法上繼承(extend)了類a, 那麼在語義上類b是乙個類a.
2. 如果乙個類b在語法上實現了(implement)介面i, 那麼類b遵從介面i制定的協議.
使用abstract class的根本原因在於, 人們希望通過這樣的方式, 表現不同層次的抽象.
而inte***ce的本質是一套協議. 在程式設計的發展中, 人們又發現介面可以用來表示對行為的抽象, 不過, 這只是inte***ce的一種用法不是其本質.
理論結合實際才是最好的學習方式, 不過在這裡, 我只想舉一些我見到過關於介面使用的反面教材:
1. 在介面中包含資料成員. 這幾乎肯定是錯的, 因為協議是規範是標準, 不應該跟具體實現有任何牽連, 也不應該給具體實現造成任何負擔.
2. c++中 delete 掉乙個介面. 例如:
複製** **如下:
class iinte***ce()
; …
} class classimpl : public iinte***ce
int main()
從語法的角度和語言自身的角度來看, 這是可行的, 而且只要將介面的析構函式設定為virtual, 就能避免記憶體洩漏. 但我要說, 這不是語法和語言的問題, 而是從根本上就錯了. 因為介面是一套協議, 一套規範, 並不是實現. delete 乙個介面的**, 到底想要表達什麼樣的語義? 如果一段**從語義上都說不通, 就不應該出現在程式中.
要在c++中表現介面的概念, 一種做法是這樣:
複製** **如下:
class iinte***ce
// 不應當有析構函式, 因為從語義上說, 介面是不能delete的.
如果要delete, 只能delete乙個類的例項:
複製** **如下:
class a
class b : public a
int main()
我們可以這樣做, 因為pa對應的是乙個例項ozrbygizl, 我們可以在a這一層將其銷毀.
先舉個例子,方便大家理解,然後從例子中抽象概括出結理論。
比如,一家生產門的公司,需要先定義好門的模板,以便能快速生產出各種規格的門。
這裡的模板通常會有兩類模板:抽象類模板和介面模板。
抽象類模板:這個模板裡面應該包含所有門都應該具有的共同屬性(如,門的形狀和顏色等)和共同行為(如,開門和關門)。
介面模板:有些門可能需要具有報警和指紋識別等功能,但這些功能又不是所有門必須具有的,所以像這樣的行為應該放在單獨的介面中。
有了上面的兩類模板,以後生產門就很方便了:利用抽象類模板和包含了報警功能的介面模板就能生產具有報警功能的門了。同理,利用抽象類模板和包含了指紋識別功能的介面模板就能生產具有指紋識別功能的門了。
總之:抽象類用來抽象自然界一些具有相似性質和行為的物件。而介面用來抽象行為的標準和規範,用來告訴介面的實現者必要按照某種規範去完成某個功能。
這是我自己的看法,歡迎大家和我**這個問題。
本文標題: c++中抽象類和介面的區別介紹
本文位址:
C 中抽象類和介面的區別
首先抽象類中有抽象成員和非抽象成員 和普通類成員一樣 而介面的所有成員都必須在實現介面的 類中實現。抽象類可以有自己的字段,但是介面不能有自己的字段,建構函式,析造函式,靜態成員或常量。從用途上來說,抽象類主要是提供為物件系列的基類,共享一些主要特性,使繼承於乙個抽象類的物件都具有乙個共同的目的或者...
c 中抽象類和介面的區別
一 概念 抽象類 顧名思義,抽象類首先是對類進行抽象的。而類是對物件進行抽象的 當設計乙個新的抽象類時,一定是用來繼承的,定義乙個抽象類,但不用來繼承就失去了它的意義了。具體類不是用來繼承的,只有抽象類是用來繼承的。比如 貓,狗,牛,羊,是具體的類,此時可以把這些類的一些共性抽象出乙個動物類,這個動...
C 中抽象類和介面的區別
一 抽象類 抽象類是特殊的類,只是不能被例項化 除此以外,具有類的其他特性 重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能宣告於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自乙個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。...