C++原稿:パッケージと継承

7779 ワード

可視性レベル
C++クラスは、データ構造とアルゴリズムのカプセル化、および対応する3つの可視レベルを提供します.異なる可視性を定義します.
Public:現在のクラスおよびサブクラスのメソッドに表示され、外部に表示されます.
Protected:現在のクラスおよびサブクラスのメソッドに表示され、外部には表示されません.
Private:現在のクラスのメソッドに表示され、外部には表示されません.
1つのオブジェクトのメンバー関数では、他の同類オブジェクトのプライベートメソッドを呼び出すことができます.
多くの現代のオブジェクト向け言語では、PrivateとPublicの2つの可視性しか提供されず、C++の可視レベルはやや複雑です.しかし、3つの継承方式とマルチ継承メカニズムは、問題をさらに複雑にしている.簡単に言えば、ここではPrivateとPublic方式の単一継承のみについて説明します.
Public継承:サブクラスにアクセス可能なベースクラスpublicprotectedのメンバーで、サブクラスの外部に表示されます.
Private継承:サブクラスではベースクラスpublicprotectedのメンバーにアクセスでき、サブクラスの外部は表示されません.
クラスの継承
Public継承は「1つ」の関係を表し,サブクラスのオブジェクトはベースクラスのオブジェクトでもある.サブクラスの動作はベースクラスの動作に一致する必要があります.したがって、Public継承では通常、ベースクラスメンバーは上書きされません.
Public継承では、サブクラスのポインタ、参照、変数をベースクラスのポインタ、参照、変数に直接割り当てることができます.
Private継承は「...実装」の関係で、サブクラスはベースクラスで実装されます.サブクラスのオブジェクトの場合、その外部にベースクラスが表示されない動作です.Private継承はオブジェクトの組合せに似ています.
class CBase{};
class CDerived: public CBase{
public:
    CDerived(): CBase(){}
};

メンバーの上書き
サブクラスで宣言されたメンバーは、ベースクラスの同じ名前のメンバーを上書きしますが、ベースクラス名で呼び出すことができます.
class CBase{
public:
    int i;
};
class CDerived: public CBase{
public:
    int i;
    void func(){
        CBase::i = 1;
    }
};

メンバー変数と同様に、ベースクラスのメンバー関数もベースクラス名で呼び出す必要があります.
クラスを閉じる
メンバー・オブジェクトを持つクラスを閉じたクラスと呼びます.これは、オブジェクトの組合せの実装方法です.コンストラクション関数の初期化リストで初期化できます.
class CPerson{
    CHead head;
    CBody body;
public:
    CPerson(head_, body_):head(head_), body(_body){}
};

オブジェクトメンバーのコンストラクション関数パラメータが空でない場合、現在のクラスにコンストラクション関数を指定する必要があることは明らかです.
初期化リストを指定せずに、コンストラクション関数でメンバーオブジェクトの割り当てを行うこともできます.これにより、メンバーオブジェクトが複数回構築されます.ただし、定数タイプ、参照タイプのメンバーは割り当てを受け入れないため、初期化リストでのみ初期化できます.
構造と分析過程
オブジェクトの構築では、まず親クラスのコンストラクション関数を完了し、メンバーオブジェクトの構築を完了し、最後に現在のクラスのコンストラクション関数を呼び出します.
親のオブジェクトを作成します.このプロシージャのオブジェクトのダイナミックタイプは、依然として親です.
オブジェクトのプロパティを作成します.インスタンス化された順序は、初期化リストの順序に関係なく、クラスで宣言された順序にのみ依存します.
コンストラクション関数を呼び出します.ここで、現在のクラスで指定されたコンストラクションプロセスを完了します.
オブジェクトのプロファイル処理は正反対で、まず現在のクラスのプロファイル関数を呼び出し、次にオブジェクト属性をプロファイルし、最後に親オブジェクトをプロファイルします.
友元
C++にはパッケージを破壊する構文特性:友元が存在する.しかし、友元によってクラスの拡張と演算子の再ロードをよりよく実現することができます.具体的には、プライベートメンバーにアクセスできる友元関数と友元クラスが含まれます.
友元の関係は伝えられない.
友元関数は、クラス宣言にfriendキーワードを追加し、パラメータを使用してクラスのインスタンスに入力して操作できます.友元関数は、別のクラスのメンバー関数であってもよい.
class CPerson{
    int age;
public:
    friend void SetAge(CPerson&, int);
    friend void CGod::createMan();
};
void SetAge(CPerson& p, int n){
    p.age = n;
}

友元クラスの論理は比較的簡単で、宣言で友元クラスを与えると、プライベートな権限が与えられます.
class CPerson{
public:
     friend class God;
};

明記しない限り、本ブログの文章はすべてオリジナルで、転載はリンク形式で本文の住所を明記してください.http://harttle.com/2015/06/29/cpp-encapsulation-and-inheritance.html