[C ++詳細分析] 37. C ++の抽象クラスと抽象インターフェース

1抽象クラス

1.1なぜ抽象クラスがあるのか

オブジェクト指向解析を行う場合、抽象的な概念がいくつかありますが、下図に示すように、長方形クラスと円形クラスは形状クラスのサブクラスであり、いずれも面積を求める機能を持っています。ただし、特定の形状の領域を見つけることは意味があり、概念的な「グラフ」の領域を見つけることは意味がありません。
ここに画像の説明を挿入
グラフィックは単なる概念的なタイプであり、特定のオブジェクトはありません。ただし、グラフィックスは依然として必要です。

ここでのグラフィックスクラスは、実際の抽象概念を表すために使用される抽象クラスとして設計する必要があります。特定のオブジェクトはなく、関連する関数は完全には実装されていないため、継承と書き換えのみが可能です。

1.2抽象クラスと純粋仮想関数

私たちは過去に仮想関数を学びましたが、それらはvirtualキーワードを通じて実装されています。関数本体の実現を与えずに、直接「= 0」は純粋な仮想関数です

構文規則は次のとおりです。
ここに画像の説明を挿入
「= 0」は、関数本体を定義せずに、純粋仮想関数を現在宣言していることをコンパイラーに通知します

抽象クラス

  • 純粋な仮想関数を持つクラスは抽象的です
  • 純粋仮想関数は、プロトタイプのみを定義するメンバー関数であり、実装は提供されていません
  • 純粋仮想関数は、実装後に仮想関数になります
  • サブクラスがすべての純粋仮想関数を実装していない場合でも、サブクラスは抽象クラスのままです
// 37-1.cpp
#include<iostream>
using namespace std;
class Shape
{
public:
    virtual double area() = 0;
};
class Rect : public Shape
{
public:
    Rect(int a, int b) : ma(a), mb(b) {}
    double area()
    {
        return ma * mb;
    }
private:
    int ma;
    int mb;
};
class Circle : public Shape
{
public:
    Circle(int r) : mr(r) {}
    double area()
    {
        return 3.14 * mr * mr;
    }
private:
    int mr;
};
void area(Shape* p)
{
    double s = p->area();
    cout << "area = " << s << endl;
}
int main()
{
    Rect rect(1, 2);
    Circle circle(10);
    area(&rect);
    area(&circle);
    return 0;
}

Shapeは抽象クラスであり、オブジェクトを生成できません。Shapeオブジェクトは無意味であるため、知らないうちにShapeオブジェクトが生成されるのを防ぎます。純粋な仮想関数が実装されると、それはポリモーフィズムを実装する仮想関数になります。抽象クラスのポインターサブクラスのオブジェクトは、オブジェクトタイプに従ってサブクラスのメンバー関数を動的に呼び出し、特定の形状の領域を見つけることができます。

$ g++ 37-1.cpp -o 37-1
$ ./37-1
area = 2
area = 314

2インターフェース

次の条件を満たすC ++クラスはインターフェイスになります

  • クラスで変数が定義されていません
  • すべてのメンバー関数は純粋な仮想関数であり、パブリックです

次のようにインターフェイスを実装します。

class Channel
{
public:
    virtual bool open() = 0;
    virtual void close() = 0;
    virtual bool send(char* buf, int len) = 0;
    virtual int receive(char* buf, int len) = 0;
};

メンバー変数はなく、パブリックな純粋仮想関数のみです。

3まとめ

1.抽象クラスは、現実の世界で抽象的な概念を記述するために使用されます
。2。抽象クラスは、純粋仮想関数によって実装され
ます。3。抽象クラスは、継承のみ可能でオブジェクトを作成できません

298件のオリジナル記事を公開 181 件を賞賛 100,000回以上の閲覧

おすすめ

転載: blog.csdn.net/happyjacob/article/details/104432699