{"id":18839215,"url":"https://github.com/solareenlo/42cpp-module-04","last_synced_at":"2026-01-28T19:30:14.142Z","repository":{"id":93865674,"uuid":"371674849","full_name":"solareenlo/42cpp-module-04","owner":"solareenlo","description":"C++ practice 04 (Subtype polymorphism, abstract classes, interfaces)","archived":false,"fork":false,"pushed_at":"2021-05-31T06:17:57.000Z","size":90,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-30T09:16:03.696Z","etag":null,"topics":["42","42born2code","42cursus","42projects","cpp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/solareenlo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-05-28T11:13:08.000Z","updated_at":"2021-05-31T06:22:18.000Z","dependencies_parsed_at":"2023-03-08T12:45:42.028Z","dependency_job_id":null,"html_url":"https://github.com/solareenlo/42cpp-module-04","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solareenlo%2F42cpp-module-04","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solareenlo%2F42cpp-module-04/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solareenlo%2F42cpp-module-04/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solareenlo%2F42cpp-module-04/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/solareenlo","download_url":"https://codeload.github.com/solareenlo/42cpp-module-04/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239774333,"owners_count":19694700,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42","42born2code","42cursus","42projects","cpp"],"created_at":"2024-11-08T02:42:23.363Z","updated_at":"2026-01-28T19:30:14.016Z","avatar_url":"https://github.com/solareenlo.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 42cpp-module-04\n\n### ex03\n- Abstract と Interface の組合せ．\n- [Meaning of *\u0026 and **\u0026 in C++](https://stackoverflow.com/questions/5789806/meaning-of-and-in-c)\n- delete を2回すると double free と同じように heap-use-after-free になる．\n\n### ex02\n- Interface\n  - [抽象クラスとインターフェース](https://programming-place.net/ppp/contents/cpp/language/029.html)\n    - interface は `can-do` 関係，abstract は `is-a` 関係．\n    - インターフェースとは，純粋仮想関数だけで構築された抽象クラスの特別なバージョンのこと．\n    - インターフェースは，can-do 関係と呼ばれる関係性を構築する．\n    - インターフェースは，そこから派生したクラスが「何ができるか」を表現するもの．\n  - [C++ インターフェースの実現方法](https://marycore.jp/prog/cpp/interface-class-and-duck-typing/)\n    - [純粋仮想関数](https://marycore.jp/prog/cpp/abstract-class-with-pure-virtual-function/)\n    - [virtualデストラクタ](https://marycore.jp/prog/cpp/virtual-destructor/)\n- [基本クラスを指すポインタは、その派生クラスも指すことができる](http://www.ced.is.utsunomiya-u.ac.jp/lecture/2012/prog/p3/kadai3/virtualfunc2.php)\n    ```c++\n    class Base {\n    public:\n        int m_1;\n        int m_2;\n        int m_3;\n        void function() { ... }\n    };\n    class Derived : public Base {\n    public:\n       int m_4;\n       int m_5;\n       void function() { ... } //Baseのメンバ関数を再定義\n    };\n    ```\n    この時に，Derived クラスのオブジェクトを指すのに，Base クラスを指すポインタを使用しても良いということ．\n    ```c++\n    Base* pb = new Base(); //OK\n    Derived* pd = new Derived(); //当然これもOK\n    Base* pb2 = new Derived();  //そしてこれもOK\n    Derived* pd2 = new Base();  //これは NG!\n    ```\n- [C dynamically growing array](https://stackoverflow.com/questions/3536153/c-dynamically-growing-array)\n    ```c\n    typedef struct {\n      int *array;\n      size_t used;\n      size_t size;\n    } Array;\n\n    void initArray(Array *a, size_t initialSize) {\n      a-\u003earray = malloc(initialSize * sizeof(int));\n      a-\u003eused = 0;\n      a-\u003esize = initialSize;\n    }\n\n    void insertArray(Array *a, int element) {\n      if (a-\u003eused == a-\u003esize) {\n        a-\u003esize *= 2;\n        a-\u003earray = realloc(a-\u003earray, a-\u003esize * sizeof(int));\n      }\n      a-\u003earray[a-\u003eused++] = element;\n    }\n\n    void freeArray(Array *a) {\n      free(a-\u003earray);\n      a-\u003earray = NULL;\n      a-\u003eused = a-\u003esize = 0;\n    }\n    ```\n- [delete前のNULLチェック](http://ges.blog.shinobi.jp/c--%E5%9F%BA%E7%A4%8E/delete%E5%89%8D%E3%81%AEnull%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)\n  - C++の規格で \"if the value of the operand of delete is the null pointer the operation has no effect.\" となっているので，NULL チェックする必要はない．\n- [deleteとdelete[ ]の違い](https://superactionshootinggame4.hatenablog.com/entry/2018/01/26/135038)\n  - `delete` は配列オブジェクトの先頭要素のデストラクタしか呼ばない．\n  - `delete[]` は配列の全要素のデストラクトを呼ぶ．\n- [Dynamic allocation with DOUBLE POINTERS](https://stackoverflow.com/questions/5721728/dynamic-allocation-with-double-pointers)\n    ```c++\n    Toy **ptr = new Toy *[n];\n    ```\n- [new, new[]](https://programming-place.net/ppp/contents/cpp/language/014.html)\n    ```c++\n    new 型名; // デフォルトコンストラクが呼ばれる\n    new 型名(実引数の並び); // 引数ありのコンストラクタが呼ばれる\n    new 型名[要素数]; // 要素数個の動的メモリ割り当てが行われる\n    new 型名*[要素数]; // 要素数個のポインタの動的メモリ割り当てが行われる\n    ```\n\n\n### ex01\n- Abstract (抽象クラス)\n  - [抽象クラスとインターフェース](https://programming-place.net/ppp/contents/cpp/language/029.html)\n    - 抽象クラスとは，純粋仮想関数を含んだクラスのこと．\n    - 純粋仮想関数とは，中身のない仮想関数のこと．\n    - 抽象クラスは，公開継承して使うのであれば，is-a 関係を構築する機能のこと．\n  - [なぜ抽象クラス(Abstract)を実装するのか](https://qiita.com/aiko_han/items/e8ddce85188970fd77da)\n  - 抽象クラスの特徴\n    - 抽象クラスを継承したサブクラスは、抽象クラスにある抽象メソッドのオーバーライド必須\n    - サブクラスでコンストラクタを記述しなければならない\n    - 直接インスタンス化できない\n    - 多重継承はできない\n\n\n### ex00\n- Override\n  - [関数のオーバーライド](http://wisdom.sakura.ne.jp/programming/cpp/cpp31.html)\n  - [C++ でデストラクタを virtual にしなくてはならない条件と理由](https://www.yunabe.jp/docs/cpp_virtual_destructor.html)\n  - virtual なメソッドがあるなら、子クラスのポインタは必ず親クラスのポインタとして使用される．\n  - 逆に言うと，親クラスのメンバ関数に virtual が無いと，子クラスのメンバ関数を使用する時には，親クラスのメンバ関数が使用される．\n  - 親クラスのメンバ関数が使用されるので，それを子クラスのメンバ関数で上書きすると言うこと．\n  - デストラクタが virtual でない場合，親クラスの型のポインタを delete した際には親クラスのデストラクタしか呼ばれない．\n    - なぜなら，デストラクタは、派生クラスから基本クラスへ向かって順番に呼び出される．\n    - すなわち，派生クラスから順にデータを解放していくことを表す．\n    - もし，デストラクタが仮想関数を呼び出した場合，派生クラスの情報は，すでに崩壊している可能性があるため．\n    - ので，親クラスのデストラクタに virtual を付けることで，\n\n- Polymorphism\n  - オーバーライド，オーバーロードのことを，総称して，ポリモーフィズム (Polymorphism) と言う．\n  - [一週間で身につくC++言語の基本 ポリモーフィズム](https://cpp-lang.sevendays-study.com/day7.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolareenlo%2F42cpp-module-04","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsolareenlo%2F42cpp-module-04","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolareenlo%2F42cpp-module-04/lists"}