C 抽象基類和純虛函式

2021-06-18 13:59:10 字數 1792 閱讀 2292

為什麼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 在很多情況下,基類本身生成物件是不合情理的。抽象基類不能夠被例項化,它定義的純...