C 純虛函式和抽象類

2021-08-01 12:54:23 字數 2266 閱讀 8288

本文**

在介紹抽象類之前,我們先介紹一下純虛函式。

1.純虛函式

在基類中僅僅給出宣告,不對虛函式實現定義,而是在派生類中實現。這個虛函式稱為純虛函式。普通函式如果僅僅給出它的宣告而沒有實現它的函式體,這是編譯不過的。純虛函式沒有函式體。

純虛函式需要在宣告之後加個=0;

class 基類名

> ;

2.抽象類

含有純虛函式的類被稱為抽象類。抽象類只能作為派生類的基類,不能定義物件,但可以定義指標。在派生類實現該純虛函式後,定義抽象類物件的指標,並指向或引用子類物件。

1)在定義純虛函式時,不能定義虛函式的實現部分;

2)在沒有重新定義這種純虛函式之前,是不能呼叫這種函式的。

抽象類的唯一用途是為派生類提供基類,純虛函式的作用是作為派生類中的成員函式的基礎,並實現動態多型性。繼承於抽象類的派生類如果不能實現基類中所有的純虛函式,那麼這個派生類也就成了抽象類。因為它繼承了基類的抽象函式,只要含有純虛函式的類就是抽象類。純虛函式已經在抽象類中定義了這個方法的宣告,其它類中只能按照這個介面去實現。

3.介面和抽象類的區別

1)c++

中我們一般說的介面,表示對外提供的方法,提供給外部呼叫。是溝通外部跟內部的橋梁。也是以類的形式提供的,但一般該類只具有成員函式,不具有資料成員;

2)抽象類可以既包含資料成員又包含方法。

抽象類的例項

1.抽象類

ishape

作為基類:只有標頭檔案,沒有實現檔案

#ifndef shape_h

#define shape_h

#include

using std::string;

//inte***ce

class ishape

;#endif

2.派生類

circle

類繼承自抽象類

ishape

circle.h標頭檔案:

#ifndef circle_h

#define circle_h

#include"shape.h"

class ccircle : public ishape //公有繼承自

ishape類

;#endif

circle.cpp實現檔案:

#include"circle.h"

ccircle::ccircle(float radius)

:m_fradius(radius) //使用建構函式的初始化列表初始化

float ccircle::getarea() / /實現實現兩個基類的函式

virtual string getname();

string ccircle::getname()

3. 派生類

rect

類繼承自抽象類

ishape

rect.h標頭檔案:

#ifndef rect_h

#define rect_h

#include"shape.h"

class crect : public ishape

;rect.cpp實現檔案:

#include"rect.h"

crect::crect(float fwidth, float fheight)

:m_fwidth(fwidth), m_fheight(fheight)

float crect::getarea()

string crect::getname()

4.測試檔案

main.cpp

:#include

#include"rect.h"

#include"circle.h"

using namespace std;

int main()

執行結果如下:可以看到,我們使用父類的指標呼叫同乙個函式,分別呼叫了這兩個派生類的對應函式,它根據指標指向的型別的不同來決定呼叫的方法。即使我們以後需要新增加幾個類,我們還是這種呼叫方法,這就是多型的巨大魅力。

c 純虛函式和抽象類

在c 多型中,父類的作用就是提供乙個虛函式類方便進行多型,那麼實際上父類的用處幾乎等於沒有,所以c 提供了純虛函式和抽象類 純虛函式的語法 virtual 返回值型別 函式名 引數列表 0 只要在類中建立出純虛函式,那麼這個類就會變成抽象類,無法例項化物件,也就是無法建立物件,同時如果他的子類沒有重...

C 虛函式和純虛函式和抽象類

虛函式是類的一種特殊成員函式,主要是為實現c 的多型特性引入。虛函式之所以 虛 是因為呼叫的虛函式不是在靜態編譯 靜態編聯 時確定,而是在執行時通過動態編聯確定的。多型核心理念即是通過基類訪問派生的子類,通常情況是借助基類指標來訪問派生類物件。note 1 析構函式通常宣告為虛函式,這樣在有繼承場合...

c 抽象類 純虛函式

1 錄入下面程式,分析編譯錯誤資訊。include include include using namespace std class abstract virtual void f 0 int main 分析 這個程式最大的問題就是abstract p new abstract 定義了乙個抽象類的...