C ++の継承、派生、多型

継承は、上の既存のクラスに基づく新しいクラスを作成することです。

既存のクラスが呼び出された基底クラスとしても知られ、父親、新しいクラスの確立が呼ばれる派生クラスをとしても知られ、サブクラス

継承は、私たちはコードの再利用機能を達成し、効果の効率を改善するために、データメンバとメンバ関数の一部を書き換えることなく、別のクラスに基づいてクラスを定義することを可能にします。

基底クラスと派生クラス

クラスは複数のクラスに由来することができるベースクラスの複数からのデータと機能を継承。私たちは、基本クラスを指定するには、派生クラスのリストを使用します。

class derived-class: access-specifier base-class

どこにアクセス修飾子access-specifierpublicprotectedまたはprivate、指定されていない場合、デフォルトの1 private

取り扱いの例

class Shape {
public:
    void setWidth(int w) {
        width = w;
    }
    void setHeight(int h) {
        height = h;
    }
protected:
    int width;
    int height;
};
class Rectangle: public Shape {
public:
    int getArea() {
        return (width * height);
    }
};
int main(void) {
    Rectangle Rect;
    Rect.setWidth(5);
    Rect.setHeight(7);
    cout << "Total area: " << Rect.getArea() << endl;
}

派生クラスは、基本クラスのプロパティは、基本クラスの振る舞いを継承し、追加の動作を追加することができます継承し、あなたはこれらの動作を再定義することができます。

データメンバは、派生クラスの基底クラスのデータメンバで定義されており、追加する場合、同じ名前を、基底クラスのデータメンバが覆われています。でも、同じ関数名ならば、異なるパラメータは、基底クラスの関数を呼び出すことはできません注意してください。

訪問時には、ハンドルのタイプは、クラスメンバーがアクセスされるかを決定します。同じ名前を持つオブジェクトの名前または参照アクセス部材を使用して、ポインタの種類に応じて、参照の種類に応じて、アクセス基本クラスメンバへのポインタは、同じ名前を使用して決定決定。

アクセス制御

派生クラスは、基本クラスのすべての非privateメンバにアクセスすることができます。基底クラスのコンストラクタ、デストラクタは、オーバーロード演算子は、フレンド関数が除去された以外の派生クラス継承全ての方法。

次のように継承ルールの異なる種類があります

  • 公共の継承(パブリック):
    • 基本クラスのパブリック派生クラスのメンバパブリックメンバー
    • 基本クラス保護するために、派生クラスのメンバー保護メンバーを
    • 基本クラスのプライベート派生クラスのメンバーが直接アクセスすることはできませんが、基本クラスを呼び出すことができ、パブリックおよび保護するためにメンバーへのアクセスを。
  • 保護された継承(保護):
    • 基本クラスのパブリックおよび保護派生クラスのメンバーになります守るためにメンバーを。
  • プライベート継承(プライベート):
    • 基本クラスのパブリックおよび保護派生クラスのメンバーはなりますプライベートメンバー。

基底クラスの友達は、民間ベースクラスのメンバーだけでなく、基本クラスから派生クラスの継承のメンバーにアクセスすることができます。派生クラスのフレンド関数派生クラスのプライベートメンバーにのみアクセスできますが、基本クラスのプライベートメンバーにアクセスすることはできません。

基本クラスをコピーするコピーのみ派生クラスのグレードのコピーコンストラクタは、基本クラスは、派生クラスをコピーするために使用することはできません。

仮想および多型

仮想関数と純粋仮想関数

仮想関数は、基本クラスのポインタは、この関数のサブクラスを呼び出すことができるようにするために定義されています。

例えば、以下の手順を出力します B

class A {
public:
    virtual void foo() {
        cout<<"A"<<endl;
    }
};
class B:public A {
public:
    void foo() {
        cout<<"B"<<endl;
    }
};
int main() {
    A *a = new B();
    a->foo();
}

ここでは、呼び出しはコンパイル時に決定されますが、実行時に決定された機能ではありません。換言すれば、コンパイル時に、呼び出された関数又はクラスの基本クラスを派生された機能を知りません。

単にインターフェイスを実装するために、表現機能が実装されていない、純粋仮想関数として定義されます。これは、基底クラスで定義されているが、任意の派生クラスは、独自の実装を定義しなければならないことを要求されていません。定義された方法

virtual void func()=0;

ポリモーフィズム

オブジェクト指向言語では、インタフェースの異なる実装の数が多型です。

多型クラスは、サブクラスタイプ親ポインタ型へのポインタの割り当てを可能にします。この割り当ての後、親オブジェクトは、その子オブジェクトに割り当てられた現在の特性に応じて異なる方法で動作することができます。

添加することにより、基本クラスの前にアプリケーションの観点からは、virtualキーワードが仮想宣言し、実行時にオブジェクトの実際のタイプに基づいて説明する対応する機能を呼び出す、派生クラスでこの機能をオーバーライドします。オブジェクト・タイプが派生クラスである場合、派生クラスが呼び出され、オブジェクト・タイプは基本クラスである場合、基本クラスが呼び出されます。

自動的にクラスに属するのvtable内のテーブルに隠されたポインタを追加するすべての仮想オブジェクトクラスは、すべての機能の仮想アドレスがあります。

とクラスの仮想関数

各クラスには、仮想テーブルを持っており、仮想テーブルを継承することができます。

サブクラスが仮想関数をオーバーライドしていない場合は、アドレスサブクラス仮想テーブルはまだ機能のものであろうが、基底クラスの仮想関数にこのアドレスポイントが達成するために。

対応する仮想関数を書き換える場合は、テーブル内の仮想アドレスは、それ自体に実装された仮想関数が変更されます。

派生クラスは、独自の仮想関数を持っている場合は、仮想テーブルが追加されます。

関数は、対応する機能が実行時にオブジェクトの実際のタイプに基づいて説明する呼び出し、派生クラスでオーバーライドされた基底クラスの仮想関数を定義即ちようクラスは、多形と呼ばれます。

その領域分類多型多型と機能に注意してください。多型は、この関数を呼び出すとき、それは同じ名前の異なる機能を呼び出す、異なるパラメータの関数として定義される関数の複数の機能を指します。

概要

基本クラスから派生クラスの継承は、基底クラスは、より詳細な、特定のオブジェクトのセットのオブジェクトの集合として記述することができます。派生クラスは、基本クラスのプロパティは、基本クラスの振る舞いを継承し、追加の動作を追加することができます継承し、あなたはこれらの動作を再定義することができます。

仮想関数が基底クラスの関数呼び出しサブクラスへのポインタを可能にすることです。どちらの関数呼び出しはコンパイル時に決定されるべきではなく、実行時に決定されました。

単にインターフェイスを実装するために、表現機能が実装されていない、純粋仮想関数として定義されます。これは、基底クラスで定義されているが、任意の派生クラスは、独自の実装を定義しなければならないことを要求されていません。

多型クラスは、サブクラスタイプ親ポインタ型へのポインタの割り当てを可能にします。この割り当ての後、親オブジェクトは、その子オブジェクトに割り当てられた現在の特性に応じて異なる方法で動作することができます。

おすすめ

転載: www.cnblogs.com/mollnn/p/12612713.html