継承 - (2012/12/05 (水) 17:28:33) の編集履歴(バックアップ)
クラスの継承
クラスは継承という概念を使い拡張することが可能です。
継承はあるクラスから性質を受け継いで新しクラスを作ることで
継承はあるクラスから性質を受け継いで新しクラスを作ることで
- 新しいメンバ関数、メンバ変数の追加
- メソッドの上書き
等が出来ます。
拡張される側のクラスの事を
「基底クラス」
といい
拡張された側のクラスを
「派生クラス」
といいます。
クラスの継承は以下のようなルールがあります。
拡張される側のクラスの事を
「基底クラス」
といい
拡張された側のクラスを
「派生クラス」
といいます。
クラスの継承は以下のようなルールがあります。
- 派生クラスは基底クラスのメンバ変数と関数を受け継ぐ。
- 基底クラスは1つしか指定できない。
- 派生クラスは複数作成可能。
以下のサンプルでは
「人間」を継承して「学生」クラスを定義しています。
「人間」を継承して「学生」クラスを定義しています。
#pragma once #include < string > class Person { public: std::string name; int age; };
#pragma once #include "Person.h" class Student : public Person { public: std::string id; //学籍番号 };
コンストラクタ
コンストラクタは継承されません。
派生クラスのコンストラクタが呼ばれたときに、基底クラスのコンストラクタが自動的に呼び出されます。
順序としては
派生クラスのコンストラクタが呼ばれたときに、基底クラスのコンストラクタが自動的に呼び出されます。
順序としては
基底クラスのコンストラクタ 派生クラスのコンストラクタ
の順で呼び出されます。
普通に派生クラスのコンストラクタを書くと、基底クラスの引数なしコンストラクタが呼び出されます。
普通に派生クラスのコンストラクタを書くと、基底クラスの引数なしコンストラクタが呼び出されます。
基底クラスの引数ありコンストラクタを呼ぶ方法。
基底クラスの引数ありコンストラクタを呼びたいときは以下のように行う
Person(string name, int age);
という既定クラスのコンストラクタがある場合。
Student::Student(string name, int age, string id ) : Person(name, age){ this->id = id; }
デストラクタ
派生クラスのデストラクタが呼ばれたとき、基底クラスのデストラクタが自動的に呼び出されます。
順番としては
順番としては
派生クラスのデストラクタ 基底クラスのデストラクタ
の順で呼び出されます。
問題
問題1
Person クラスを継承してStudentクラスを作成せよ。
(現段階ではカプセル化は気にせず全てのメンバはpublicでよい)
Person
(現段階ではカプセル化は気にせず全てのメンバはpublicでよい)
Person
string name; int age;
Student
string id;
問題2
問題1で作成した2つのクラスにコンストラクタとデストラクタを設け
呼ばれる順番が確認できるように、コンソールにメッセージを出力せよ。
呼ばれる順番が確認できるように、コンソールにメッセージを出力せよ。
問題3
問題2で作成した2つのクラスにおいて
オーバーロードを用いてコンストラクタを複数定義せよ。
メッセージ表示はクラス名、引数の有無の区別ができるようにすること。
引数なし、メッセージ表示のみ
オーバーロードを用いてコンストラクタを複数定義せよ。
メッセージ表示はクラス名、引数の有無の区別ができるようにすること。
引数なし、メッセージ表示のみ
Person();
引数あり、メッセージ表示と値のセット
Person(string name, int age);
引数なし、メッセージ表示のみ
Student();
引数あり、メッセージ表示と値のセット
Personの引数ありコンストラクタと連動させる
Personの引数ありコンストラクタと連動させる
Student(string name, int age, string ID);