継承、多形性


상속은 is-a관계

ex) 자동차는 탈것이다.(Car is a Vehicle).
has-a관계는  상속으로 모델링하면 안된다~

ex) 도서관은 책을 가지고 있다.

has-a관계는 하나의 클래스 안에 다른 클래스의 객체를 포함시키면 된다.

📒 継承された創造者/消滅者


サブクラス内のオブジェクトが作成されると、サブクラスの作成者が親クラスの作成者を呼び出します.

  • ジェネレータの呼び出し順序:親->子

  • 消滅者呼び出し順序:子->親
  • 特定の作成者を指定する方法


    子クラスの作成者():親クラスの作成者()
    {
    ...
    }
  • 再定義の条件-メンバー関数のタイトルを変更せずに、ボディのみを置き換えます.見出しセクションは、親の見出しと同じでなければなりません.
  • メンバーの再定義(上書き)

    childclass obj;
    
    obj.parentclass::method() ;

    📒 たじょうたいせい


    相手のタイプが違うと、同じ情報を伝えても、違う動作をします.

    ✔アップコンバート

    class Animal
    
    class Dog : public animal
    
    class Cat : public animal
    ケース
    Dog dog;
    Animal* pa;
    pa = &dog;
    これでいいですか.
    いいですよ.子オブジェクトには親オブジェクトが含まれているため、子オブジェクトも親オブジェクトです.
    -アップコンバート(up-casting)により、親から継承された部分のみポインタで使用できます.

    ✔トップダウン変換

    Animal* pa = new Dog();
    
    Dog* pd = (Dog*)pa;
    
    親ポインタ変数は、子オブジェクトを参照できます.足が立たない.
    関数のパラメータは、子ではなく親タイプとして宣言することが望ましい.

    📒 仮想関数

  • 親のポインタが呼び出されても、親の関数が仮想関数として定義されている場合、子の再定義関数が呼び出されます.
  • class shape{
        public:
        int b;
        virtual void repr(){
            cout << "hello" << endl;
        }
    
    };
    
    class circle : public shape{
        public:
        int a;
        void repr(){
            cout << "1231231" << endl;
        }
    };
    shape* ptr = new circle();
    ptr->repr() ;            -> hello , circle의 함수가 실행된다.
    virtual 키워드는 멤버 함수에만 사용할 수 있다.(멤버 변수에 사용 X)
    Binding
  • は、プログラムコンポーネントの性質を決定する:
  • ex)変数のデータ型の決定
    出典:https://secretroute.tistory.com/entry/140819[Empty]
    関数呼び出しを実際の関数のボディに関連付けることをバインドと呼びます.
    静的バインディング:コンパイル時にすべてのバインディングを完了します.スピードが速い
    ≪動的バインド(仮想関数)|Dynamic Binding(Virtual Function)|Eas≫-バインドが実行時に遅延し、実行時に実際に呼び出される関数を決定します.スピードが遅い

    ✔仮想関数の実装


  • 仮想関数はv-tableと呼ばれるテーブルで実現されます

  • 円形オブジェクトの内部には、形状に対応する部分と円形に対応する部分があります.

  • オブジェクトに仮想関数が定義されている場合、各オブジェクトはテーブルを作成して仮想関数を管理します.オブジェクトが作成され、shapeセクションが作成された場合、仮想関数テーブルにはshapeのメンバーのアドレスがあります.次にcircleセクションを追加し、仮想関数を再定義した場合、ループ内のメンバー関数は主に小表の内容を変更します.
  • の多形性を使用する過程で、仮想消滅者でなければ問題が発生します.
    消滅者を仮想化しない場合、親ポインタが消失すると、親の消滅者のみが生成されます.
    ->仮想親の消滅者.
  • 📒 じゅんかそうかんすう

  • の関数ヘッダのみが存在し、体の関数はありません.
  • virtual 반환형 함수이름(매개변수) = 0;
    virtual 반환형 함수이름(매개변수){
    	...
    }
    仮想関数とは異なります.
    純粋な仮想関数を持つクラスを抽象クラス(abstractclass)と呼ぶ.
    注意事項.
    親は抽象クラスなので、親でオブジェクトを作成することはできません.
    ただし、サブクラス内のオブジェクトを指すポインタ変数を作成できます.
    抽象クラスが継承されると、抽象クラスに含まれるすべての仮想関数が実装される必要があります.
    クラスが抽象クラスのいずれかの仮想関数を漏らした場合、コンパイラはクラスも抽象クラスとして定義する必要があることを通知します.