為什麼c++要定義抽象基類?
c++為什麼要定義抽象基類?
抽象類就是類裡定義了純虛成員函式的類。純虛函式只提供了介面,並沒有具體實現。抽象類不能被例項化,通常是作為基類供子類繼承,子類中重寫虛函式,實現具體的介面。
為什麼要定義抽象基類呢?依我所見主要有以下原因:
1. 最重要的原因是,可以將介面與實現分離。介面是軟體產品最有價值的資源,設計介面比實現介面需要耗費更昂貴的成本。因此,要將介面保護起來,以免在針對客戶需求修改實現的時候,程式設計師不小心把介面破壞掉。
2. 引入抽象基類和純虛函式方便實現c++的多型特性。可以用抽象基類的指標去呼叫子類物件的方法。
3. 很多時候,許多基類被例項化是不合理的。例如「形狀」這個基類,被例項化之後反而會讓人相當費解,所以乾脆將「形狀」這個類定義為抽象類,由它派生出正方形,三角形等子類。
c++程式設計——抽象基類
選擇題原題如下:
下列有關抽象類和純虛函式的敘述中,錯誤的是
a)擁有純虛函式的類是抽象類,不能用來定義物件
b)抽象類的派生類若不實現純虛函式,它也是抽象類
c)純虛函式的宣告以「=0;」結束
d)純虛函式都不能有函式體
答案解析:
以下為c++.primer.plus的原文:
c++通過使用純虛函式(pure virtual function)提供未實現的函式。純虛函式宣告的結尾處為=0,參見area()方法:
class baseellipse //abstract base class
virtual ~baseellipse() {}
void move(int nx, int ny)
virtual double area() const =0; //a pure virual function
..... }
當類宣告中包含純虛函式時,則不能建立該類的物件。這裡的理念是,包含純虛函式的類只用作基類。原型中的=0使虛函式成為純虛函式。這裡的方法area()沒有定義,但c++甚至允許純虛函式有定義。例如,也許所有的基類方法都與move()一樣,可以在基類中進行定義,但你仍需要將這個類宣告為抽象的。在這種情況下,可以將原型宣告為虛擬的:
virtual void move(int nx, int ny) = 0;
這將使基類成為抽象的,但你仍可以在實現檔案中提供方法的定義:
void baseellipse::move(int nx, int ny)
總之在原型中使用=0指出類是乙個抽象基類,在類中可以不定義該函式。
總結:抽象類只能作為基類來使用,其純虛函式的實現由派生類給出。如果派生類沒有重新定義純虛函式,而派生類只是繼承基類的純虛函式,則這個派生類仍然還是乙個抽象類。如果派生類中給出了基類純虛函式的實現,則該派生類就不再是抽象類了,它是乙個可以建立物件的具體類了。
最後注意的問題:
基類的純虛函式必須有「=0」,但不一定沒有函式的實現,只是不能直接內嵌在類中。
在effective c++中一般抽象基類中的析構函式定義成純虛函式,然後在其他地方寫乙個空的析構函式體;
class base
;
base::~base(){}
這樣就可以用base作為基類的派生類呼叫自己的析構函式。
c 純虛函式和抽象基類
c 物件導向程式設計的思想之一是可以使用繼承。繼承中乙個重要的思想是使用抽象基類 abstract base class,abc 假設我們開發乙個程式,需要使用橢圓和圓兩種圖形。因為圓是橢圓的一種特殊情形,根據繼承 is a 的思想,自然會想到先定義乙個eclipse類,再將circle類繼承自ec...
純虛函式和抽象基類
純虛函式的格式 virtual 型別 函式名 參數列 0 而我們的純虛函式經常被用來構建抽象基類。抽象基類 當我們僅想對基類進行向上型別轉換,使用它的介面,而不希望使用者實際地建立乙個基類的物件,那麼我們就在基類中加入至少乙個純虛函式 pure virtual function 來使基類稱為抽象 a...
純虛函式和抽象基類
純虛函式就是基類只定義了函式體,沒有具體的實現過程,必須在子類中加以實現。如果基類中含有乙個或多個純虛函式,那麼它就屬於抽象基類,不能被例項化。1 引入抽象基類和純虛函式的原因有以下兩點 1 為了方便的是使用多型特性 2 在很多情況下,基類本身生成物件是不合情理的。抽象基類不能夠被例項化,它定義的純...