継承、多形性
상속은 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 出典:https://secretroute.tistory.com/entry/140819[Empty]
関数呼び出しを実際の関数のボディに関連付けることをバインドと呼びます.
静的バインディング:コンパイル時にすべてのバインディングを完了します.スピードが速い
≪動的バインド(仮想関数)|Dynamic Binding(Virtual Function)|Eas≫-バインドが実行時に遅延し、実行時に実際に呼び出される関数を決定します.スピードが遅い
✔仮想関数の実装
仮想関数はv-tableと呼ばれるテーブルで実現されます
円形オブジェクトの内部には、形状に対応する部分と円形に対応する部分があります.
オブジェクトに仮想関数が定義されている場合、各オブジェクトはテーブルを作成して仮想関数を管理します.オブジェクトが作成され、shapeセクションが作成された場合、仮想関数テーブルにはshapeのメンバーのアドレスがあります.次にcircleセクションを追加し、仮想関数を再定義した場合、ループ内のメンバー関数は主に小表の内容を変更します.
消滅者を仮想化しない場合、親ポインタが消失すると、親の消滅者のみが生成されます.
->仮想親の消滅者.
📒 じゅんかそうかんすう
virtual 반환형 함수이름(매개변수) = 0;
virtual 반환형 함수이름(매개변수){
...
}
仮想関数とは異なります.純粋な仮想関数を持つクラスを抽象クラス(abstractclass)と呼ぶ.
注意事項.
親は抽象クラスなので、親でオブジェクトを作成することはできません.
ただし、サブクラス内のオブジェクトを指すポインタ変数を作成できます.
抽象クラスが継承されると、抽象クラスに含まれるすべての仮想関数が実装される必要があります.
クラスが抽象クラスのいずれかの仮想関数を漏らした場合、コンパイラはクラスも抽象クラスとして定義する必要があることを通知します.
Reference
この問題について(継承、多形性), 我々は、より多くの情報をここで見つけました https://velog.io/@lkm9709/상속-다형성テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol