C++継承の定義と注意事項

6797 ワード

一、何が継承ですか?
1.1、概念
*継承メカニズムは、オブジェクトプログラム設計に向けてコードを多重化する最も重要な手段であり、プログラマが元のクラス特性を維持した上で拡張し、機能を増加させることで、新しいクラスを生み出し、派生クラスと呼ばれる。
1.2、定義
私たちはPersonが父であることを見ました。基類とも言います。Studentはサブクラスで、派生タイプとも呼ばれます。

1.2.1、相続関係とアクセス制限子

1.2.2、ベースメンバーのアクセス方式の変化を継承する

//                             
class Person
{
public :
void Print ()
{
cout<<_name <<endl;
}
protected :
string _name ; //   
private :
int _age ; //   
};
//      ,      
//class Student : protected Person
//class Student : private Person
class Student : public Person
{
protected :
int _stunum ; //   
};
注意:
1.基類prvateのメンバーは派生クラスではどんな形で継承されても見えない。基本的な私有メンバーを指すか、または派生的なオブジェクトに引き継がれるかは分かりませんが、文法的には派生的なオブジェクトはアクセスできません。
2.キーワードclassを使う時のデフォルトの継承方式はprvateで、structを使う時のデフォルトの継承方式はpublicですが、一番いい表示のは継承方式を書き出します。
3.実際の運用では普通public継承を使用していますが、protectced/prvate継承を提唱しません。protectced/prvate継承したメンバーは派生クラスの中でしか使えないので、実際にはメンテナンス性が強くないです。
二、基質と派生類の対象の割当値変換
派生類(サブクラス)のオブジェクトは、基本類(親類)のオブジェクト/ポインタ/参照に値を付けることができます。
間もなく父の種類の中のその部分は基質に割り当てられます。
ここではカットやカットというイメージがあります。派生種の中の父類の部分を切って、過去の価値を与えるという意味です。
ベースオブジェクトは派生オブジェクトに値を与えられません。
ベースのポインタは、強制的なタイプによって、派生クラスのポインタに割り当てられます。ただし、基質の指針が派生類の対象を指す場合が安全です。ここで基質が多型の場合、RTTI(Run-Type Information)のdynamic_を使用することができます。castで識別して安全に変換する。

Student sobj ;
// 1.             /  /  
Person pobj = sobj ;
Person* pp = &sobj;
Person& rp = sobj;

//2.              
sobj = pobj;//  

// 3.                        
pp = &sobj
Student* ps1 = (Student*)pp; //           。
ps1->_No = 10;
pp = &pobj;
Student* ps2 = (Student*)pp; //            ,            
ps2->_No = 10;

三、継承中のスコープ
  • は、継承システムにおいて、基質および派生クラスに独立した作用領域を有する。
  • 子類と親類には同名のメンバーがいます。子類メンバーは父親類が同名のメンバーに直接訪問することを隠しといいます。重定
  • ともいいます。
  • 義サブクラスメンバー関数では、ベースクラス:ベースメンバー表示アクセス)
  • が使用されても良い。
  • は、メンバ関数の非表示であれば、関数名が同じであれば、非表示を構成することに注意したい。
  • は、実際に継承システムの中で同名のメンバーを定義しない方がいいということに注意してください。
  • 
     // Student _num Person _num      ,            ,        
    class Person
    {
    protected :
    string _name = "   "; //   
    int _num = 111; //     
    };
    class Student : public Person
    {
    public:
    void Print()
    {
    cout<<"   :"<<_name<< endl;
    cout<<"     :"<<Person::_num<< endl;
    cout<<"   :"<<_num<<endl;
    }
    protected:
    int _num = 999; //   
    };
    void Test()
    {
    Student s1;
    s1.Print();
    };
    
    
    // B  fun A  fun      ,          
    // B  fun A  fun    ,                。
    class A
    {
    public:
    void fun()
    {
    cout << "func()" << endl;
    }
    };
    class B : public A
    {
    public:
    void fun(int i)
    
    {
    A::fun();
    cout << "func(int i)->" <<i<<endl;
    }
    };
    void Test()
    {
    B b;
    b.fun(10);
    };
    
    四、派生類のデフォルトメンバー関数
    6つのデフォルトのメンバー関数は、「デフォルト」という意味です。私たちは書かないとコンパイラが変わって、自動的に1つを生成します。派生クラスでは、これらのいくつかのタイプがあります。
    メンバー関数はどうやって生成されますか?
  • 派生クラスの構造関数は、ベースクラスの構造関数初期化ベースクラスの一部のメンバを呼び出さなければならない。ベースにデフォルトの構造がない場合
  • の数は、派生型構造関数の初期化リスト段階に呼び出しを表示しなければならない。
  • 派生クラスのコピーコンストラクタは、ベースクラスのコピー構造を呼び出してベースクラスのコピー初期化を完了する必要があります。
  • 派生クラスのoperator=ベースクラスのoperator=を呼び出してベースクラスのコピーを完了しなければなりません。
  • 派生クラスの構文関数は、呼び出しが完了した後、自動的にベースクラスの構文関数を呼び出してベースメンバーを整理する。これで派生クラスが保証される。
  • オブジェクトは、派生クラスのメンバを先に整理してから、ベースメンバーの順序を整理する。
  • 派生類オブジェクト初期化は、基質構造を呼び出してからクラス構造を調整する。
  • 派生型オブジェクトの分析処理は、まず派生型分析構成の再調整ベースの解析を呼び出します。


  • 五、引継ぎと友元
    友元関係は継承できません。つまり、基本友元はサブクラスのプライベートと保護メンバーにアクセスできません。
    六、継承と静的メンバー
    ベースクラスは、スタティックなメンバーを定義しています。継承システム全体の中には、このようなメンバーしかいません。
    七、菱形継承
    シングル引継ぎ:一つのサブクラスは直接の父親しかないです。

    複数相続:1つのサブクラスが2つ以上の直接的な父親がある場合は、この相続関係を複数の相続と呼びます。

    菱形継承:菱形継承は複数継承の特殊な場合である。

    菱形継承の問題:次の対象メンバーモデル構造から、菱形継承にはデータ冗長性と二義性があるという問題が見られます。Asistantの対象にはPersonのメンバーが2つあります。

    仮想継承は、菱形継承の二義性とデータ冗長性の問題を解決することができ、StudentとTecherの継承;
    加キーワード:virtualひし形継承メモリ対象メンバーモデル:ここでデータ冗長性が見られます。

    菱形仮想継承メモリオブジェクトメンバーモデル:ここでは、DオブジェクトにAを置いたオブジェクトの一番下にあると分析できます。このAは同時にBとCに属しています。BとCはどうやって共通のAを見つけますか?
    ここはBとCの二つのポインタを通して指す表です。この二つのポインタは虚基の時計の針といい、この二つの時計は虚基の時計といいます。虚基表に保存されているオフセット量。オフセット量で次のAが見つかります。
    虚基表:保管オフセット量


    八、継承と組合せ
    public継承は一種のis-aの関係です。つまり、派生クラスの各オブジェクトは基本的なオブジェクトであり、高結合である。
    組み合わせはhas-aの関係です。BがAを組み合わせたと仮定すると、各Bオブジェクトの中にAオブジェクトがあり、低結合がある。
    優先的にオブジェクトの組み合わせを使用します。クラスの継承ではありません。
    継承と結合の使用:
    
    // Car BMW Car Benz  is-a   
    class Car{
    protected:
    string _colour = "  "; //   
    string _num = " ABIT00"; //    
    };
    class BMW : public Car{
    public:
    void Drive() {cout << "  -  " << endl;}
    };
    class Benz : public Car{
    public:
    void Drive() {cout << "  -  " << endl;}
    };
    
    
    // Tire Car  has-a   
    class Tire{
    protected:
    string _brand = "Michelin"; //   
    size_t _size = 17; //   
    };
    class Car{
    protected:
    string _colour = "  "; //   
    string _num = " ABIT00"; //    
    Tire _t; //   
    };
    
    締め括りをつける
    ここでC++継承の定義と注意事項についての文章を紹介します。これまでの文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。