接口 (抽象類)

2018-08-12 22:03 更新

接口 (抽象類)

接口可以用來描述一個(gè) C++ 類的行為或功能,但是并不需要對(duì)這個(gè)類進(jìn)行實(shí)現(xiàn)。

C++ 接口是通過抽象類來實(shí)現(xiàn)的,這些抽象類不應(yīng)與數(shù)據(jù)抽象混淆,數(shù)據(jù)抽象的概念:概念結(jié)構(gòu)是對(duì)現(xiàn)實(shí)世界的一種抽象,從實(shí)際的人、物、事和概念中抽取所關(guān)心的共同特性,忽略非本質(zhì)的細(xì)節(jié),把這些特性用各種概念精確地加以描述,這些概念組成了某種模型。

一個(gè)抽象類的聲明里至少要有一個(gè)函數(shù)作為純虛函數(shù)。在函數(shù)形參表后面寫上 “= 0” 以指定純虛函數(shù):

    class Box
    { 
       public:
      // pure virtual function
      virtual double getVolume() = 0;
       private:
      double length;  // Length of a box
      double breadth; // Breadth of a box
      double height;  // Height of a box
    };

建立抽象類 (通常被稱為一個(gè)ABC) 的目的是提供一個(gè)適當(dāng)?shù)牟⑶移渌惪梢岳^承的基類。抽象類不能實(shí)例化對(duì)象并且只能作為一個(gè)接口使用。試圖實(shí)例化一個(gè)抽象類的對(duì)象會(huì)導(dǎo)致編譯錯(cuò)誤。

因此,如果一個(gè)抽象類的子類的需要實(shí)例化,它必須實(shí)現(xiàn)所有的虛函數(shù),這意味著它支持抽象類的接口聲明。如果在派生類中未能覆蓋一個(gè)純虛函數(shù),然后試圖實(shí)例化該類的對(duì)象,會(huì)導(dǎo)致一個(gè)編譯錯(cuò)誤。

可用于實(shí)例化對(duì)象的類被稱為具體類。

抽象類樣例

考慮下面的例子,父類為基類提供了一個(gè)接口來實(shí)現(xiàn)函數(shù) getArea()

    #include <iostream>

    using namespace std;

    // Base class
    class Shape 
    {
    public:
       // pure virtual function providing interface framework.
       virtual int getArea() = 0;
       void setWidth(int w)
       {
      width = w;
       }
       void setHeight(int h)
       {
      height = h;
       }
    protected:
       int width;
       int height;
    };

    // Derived classes
    class Rectangle: public Shape
    {
    public:
       int getArea()
       { 
      return (width * height); 
       }
    };
    class Triangle: public Shape
    {
    public:
       int getArea()
       { 
      return (width * height)/2; 
       }
    };

    int main(void)
    {
       Rectangle Rect;
       Triangle  Tri;

       Rect.setWidth(5);
       Rect.setHeight(7);
       // Print the area of the object.
       cout << "Total Rectangle area: " << Rect.getArea() << endl;

       Tri.setWidth(5);
       Tri.setHeight(7);
       // Print the area of the object.
       cout << "Total Triangle area: " << Tri.getArea() << endl; 

       return 0;
    }

上面的代碼編譯和執(zhí)行后,將產(chǎn)生以下結(jié)果:

    Total Rectangle area: 35
    Total Triangle area: 17

設(shè)計(jì)策略

一個(gè)面向?qū)ο蟮南到y(tǒng)可能使用一個(gè)抽象基類提供一個(gè)普遍的和適合所有的外部應(yīng)用程序的標(biāo)準(zhǔn)化接口。然后, 通過繼承的抽象基類, 形成派生類。

功能(即,公共函數(shù)),即由外部應(yīng)用程序提供的,作為抽象基類里面的純虛函數(shù)。 那些純虛函數(shù)是由派生類實(shí)現(xiàn)的,派生類對(duì)應(yīng)于應(yīng)用的特定類型。

即使在系統(tǒng)已經(jīng)定義之后, 這種架構(gòu)還允許添加新的應(yīng)用程序到系統(tǒng)中。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)