在介紹抽象類之前,我們先介紹一下純虛函式。
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()
執行結果如下:可以看到,我們使用父類的指標呼叫同乙個函式,分別呼叫了這兩個派生類的對應函式,它根據指標指向的型別的不同來決定呼叫的方法。即使我們以後需要新增加幾個類,我們還是這種呼叫方法,這就是多型的巨大魅力。
抽象類 抽象方法詳解
抽象類 用abstract關鍵字來修飾乙個類時,這個類叫做抽象類 1,含有抽象方法的類就叫抽象類。2,抽象類中的抽象方法必須被實現!3,如果乙個子類沒有實現父類中的抽象方法,則子類也成為了乙個抽象類!4,抽象類中的普通方法,可以不必實現。2.方法 1,含有抽象方法的類就叫抽象類。2,抽象類中的抽象方...
Java抽象類詳解
一 抽象類定義 抽象類指包含抽象方法的類叫抽象類,抽象類必須用關鍵字abstract修飾。public abstract class a a public void action 抽象方法 public abstract void fun 二 抽象類的使用 1.抽象類不能直接例項化,需要子類繼承父類...
Java 抽象類詳解
三 抽象類總結 重點知識 例項化物件 newperoson vince vu 測試類 這裡p是乙個抽象類person的變數,person引用了乙個非抽象子類student的例項 public class test 上面中你可能會有個疑問,這不是呼叫了乙個沒有定義的方法嗎 p.getdescripti...