Day 10では、継承とポリモーフィズムについて学習します。
以下にそれぞれの内容を詳細に説明します。
継承:
1. 継承の概念:
– 継承は、既存のクラス(ベースクラスまたは親クラス)を基に新しいクラス(派生クラスまたは子クラス)を作成する機能です。
– 派生クラスは、ベースクラスの属性と振る舞いを継承し、さらに新しい属性と振る舞いを追加することができます。
– 継承により、コードの再利用性と保守性を向上させることができます。
2. 構文:
class BaseClass { // BaseClassの定義 }; class DerivedClass : public BaseClass { // DerivedClassの定義 };
派生クラスは、`class` キーワードの後にクラス名を記述し、コロン `:` の後にベースクラスを指定して継承します。
継承の際には、アクセス制御指定子(`public`、`private`、`protected`)を指定できます。`public`を指定することで、派生クラスの外部からベースクラスのメンバにアクセスできるようになります。
ポリモーフィズム:
1. ポリモーフィズムの概念:
– ポリモーフィズムは、同じインターフェースを持つオブジェクトが異なるクラスであるかのように振る舞うことができる機能です。
– ポリモーフィズムにより、オブジェクトの種類を意識せずに同じ操作を実行することができます。
2. 静的なポリモーフィズム:
– 静的なポリモーフィズムは、関数のオーバーロード(同じ名前の関数を引数の型や個数を変えて複数定義すること)やテンプレートを使って実現されます。
– コンパイル時にオブジェクトの型が決定されるため、静的なポリモーフィズムと呼ばれます。
3. 動的なポリモーフィズム:
– 動的なポリモーフィズムは、仮想関数を使って実現されます。
– ポインタや参照を使ってオブジェクトを操作する場合に、実行時にオブジェクトの型に応じて適切なメンバ関数が呼ばれるようになります。
例題:
#include <iostream> // BaseClassの定義 class BaseClass { public: void display() { std::cout << "BaseClass" << std::endl; } }; // DerivedClassの定義 class DerivedClass : public BaseClass { public: void display() { std::cout << "DerivedClass" << std::endl; } }; int main() { // BaseClassのオブジェクトを作成 BaseClass baseObj; // DerivedClassのオブジェクトを作成 DerivedClass derivedObj; // BaseClassのdisplayメソッドを呼び出し baseObj.display(); // 出力: BaseClass // DerivedClassのdisplayメソッドを呼び出し derivedObj.display(); // 出力: DerivedClass // BaseClassのポインタを使ってDerivedClassのオブジェクトを操作 BaseClass* ptr = &derivedObj; ptr->display(); // 出力: BaseClass(動的なポリモーフィズムが働いている) return 0; }
演習問題:
1. 動物(Animal)クラスを定義してください。このクラスには、動物の名前を表すメンバ変数と「鳴く」メソッドが含まれるようにして
ください。その後、Animalクラスを継承した猫(Cat)クラスと犬(Dog)クラスを定義し、それぞれの鳴き声を表示するプログラムを作成してください。動物のオブジェクトを配列として作成し、ポリモーフィズムを使って全ての動物の鳴き声を表示してください。
2. 2次元の図形を表すShapeクラスを定義してください。このクラスには、図形のタイプ(円、四角形、三角形など)を表すメンバ変数と、面積を計算する仮想関数`calculateArea()`を含めてください。その後、Shapeクラスを継承した円(Circle)、四角形(Rectangle)、三角形(Triangle)のクラスを定義し、各図形の面積を計算して表示するプログラムを作成してください。
これらの例題と演習問題を解くことで、継承とポリモーフィズムの使い方を理解し、オブジェクトの振る舞いを柔軟に操作するスキルを向上させることができます。問題を解いたら、プログラムが正しく動作しているかどうかを確認してみてください。